警告:“对于长类型,整数常量太大了”......但是它是一个uint64_t?

时间:2012-07-27 15:37:19

标签: android c types android-ndk

我正在努力将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 。在这种情况下,我不确定应该如何指定它,或者我是否可以忽略这些警告。

2 个答案:

答案 0 :(得分:6)

ULL后缀添加到64位整数常量中,或将它们放在UINT64_C的详细stdint.h宏中。

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

#include <stdint.h>

static const uint64_t sw_matrix[] = {
    UINT64_C(0xfe000002a0d1c014), /* etc. */ };

答案 1 :(得分:3)

在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,它默认识别C89 / C90和一些特定于GNU的扩展。我的理解是它提供了类型long longunsigned long long作为扩展,但不会改变整数常量的语义。

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

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