我尝试在Ubnutu 9.10上使用C语言定义64位宽度的整数。 9223372036854775808是2 ^ 23
long long max=9223372036854775808
long max=9223372036854775808
编译时,编译器发出警告信息:
binary.c:79:19: warning: integer constant is so large that it is unsigned
binary.c: In function ‘bitReversal’:
binary.c:79: warning: this decimal constant is unsigned only in ISO C90
binary.c:79: warning: integer constant is too large for ‘long’ type
长型是64位宽吗?
最诚挚的问候,
答案 0 :(得分:11)
long long max=9223372036854775808LL; // Note the LL
// long max=9223372036854775808L; // Note the L
long long
类型至少为64位,long
类型至少为32位。实际宽度取决于编译器和目标平台。
使用int64_t
和int32_t
确保64/32位整数可以适合变量。
答案 1 :(得分:5)
您遇到的问题是您使用的号码(9223372036854775808)是2**63
,而long long
可以容纳的最大值(作为64位有符号2s补码类型)是少于一个 - 2**63 - 1
,或9223372036854775807(连续63个二进制1)。
对于long long
而言过大的常量(如本例所示)的类型为unsigned long long
,这就是您收到警告integer constant is so large that it is unsigned
的原因。
long
类型至少为32位,long long
类型至少为64位(均包括符号位)。
答案 2 :(得分:0)
我不确定它会解决您的问题(LL解决方案看起来不错)。但这是一个重新定位:
您应该使用十六进制表示法来写出某些内容的最大值。
unsigned char max = 0xFF;
unsigned short max = 0xFFFF;
uint32_t max = 0xFFFFFFFF;
uint64_t max = 0xFFFFFFFFFFFFFFFF;
你可以看到它是可读的。
显示值:
printf("%lld\n", value_of_64b_int);
答案 3 :(得分:0)
我认为这取决于您使用的平台。如果您需要确切知道您使用的整数类型,如果您的系统中包含此包含文件,则应使用Stdint.h中的类型。