【问题标题】:warning: "integer constant too large for long type" ... but it is a uint64_t?警告:“整数常量对于长类型来说太大了”......但它是一个 uint64_t?
【发布时间】:2012-07-27 15:37:18
【问题描述】:

我正在将 libbtbb 交叉编译到 Android,我收到大量警告说:

jni/libbtbb/bluetooth_packet.h:67: warning: integer constant is too large for 'long' type

但是,当我深入研究文件时,这指向了这一行:

static const uint64_t sw_matrix[] = {
    0xfe000002a0d1c014, 0x01000003f0b9201f, 0x008000033ae40edb, 0x004000035fca99b9,
    0x002000036d5dd208, 0x00100001b6aee904, 0x00080000db577482, 0x000400006dabba41,
    0x00020002f46d43f4, 0x000100017a36a1fa, 0x00008000bd1b50fd, 0x000040029c3536aa,
    0x000020014e1a9b55, 0x0000100265b5d37e, 0x0000080132dae9bf, 0x000004025bd5ea0b,
    0x00000203ef526bd1, 0x000001033511ab3c, 0x000000819a88d59e, 0x00000040cd446acf,
    0x00000022a41aabb3, 0x0000001390b5cb0d, 0x0000000b0ae27b52, 0x0000000585713da9};

类型是 uint64_t,而不是“long”……但它似乎是指指定像 0xfe000002a0d1c014 这样的常量。在这种情况下,我不确定应该如何指定它,或者我是否可以忽略这些警告。

【问题讨论】:

    标签: android c types android-ndk


    【解决方案1】:

    ULL 后缀添加到您的 64 位整数常量或将它们包含在来自 stdint.h 的详细 UINT64_C 宏中。

    static const uint64_t sw_matrix[] = {
        0xfe000002a0d1c014ULL, /* etc. */ };
    

    #include <stdint.h>
    
    static const uint64_t sw_matrix[] = {
        UINT64_C(0xfe000002a0d1c014), /* etc. */ };
    

    【讨论】:

      【解决方案2】:

      在 1989/1990 版本的 C 标准中,十六进制整数常量的类型是该列表中第一个可以表示其值的类型:

      • int
      • unsigned int
      • long int
      • unsigned long int

      该语言版本没有 long longunsigned long long 类型。

      1999版标准,此列表改为:

      • int
      • unsigned int
      • long int
      • unsigned long int
      • long long int
      • unsigned long long int

      看起来您正在使用 gcc,默认情况下它可以识别带有一些 GNU 特定扩展的 C89/C90。我的理解是它提供了long longunsigned long long 类型作为扩展,但不会改变整型常量的语义。

      如果您使用参数-std=c99 调用 gcc,它将(尝试)符合 C99 标准,并且警告应该会消失(无需更改您的源代码)。

      如果您想修改您的源代码,使其在没有-std=c99 的情况下编译时没有警告,那么添加ULL 后缀将导致常量为unsigned long long 类型,可能uint64_t 相同的类型,但不能保证。使用 UINT64_C() 宏可确保它们的类型正确,但有点冗长。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-22
        相关资源
        最近更新 更多