我在这里做错了什么?
$ cat size.c
#include<stdio.h>
#include<math.h>
int main() {
printf ("sizeof unsigned int = %d bytes.\n", sizeof(unsigned int));
printf ("sizeof unsigned long long = %d bytes.\n", sizeof(unsigned long long));
printf ("max unsigned int = %d\n", (int)(pow(2, 32) - 1));
printf ("max unsigned long long = %lld\n", (unsigned long long)(pow(2, 64) - 1));
}
$ gcc size.c -o size
$ ./size
sizeof unsigned int = 4 bytes.
sizeof unsigned long long = 8 bytes.
max unsigned int = 2147483647
max unsigned long long = -1
$
我希望18446744073709551615
作为输出,而不是最后一行的-1
。
好吧,我完全错过了2 32 - 1的错误值,应该是4294967295,而不是2147483647.现在事情变得更有意义了。
答案 0 :(得分:28)
不要以为它具有使用ULLONG_MAX
答案 1 :(得分:19)
使用%llu
,而不是%lld
。 d
用于有符号整数,因此printf
将其显示为已签名的长整数。
答案 2 :(得分:2)
编辑:根据Christoph的建议将〜0更改为(类型)-1。请参阅以下评论。
您可以获取无符号类型的最大值,执行以下操作:
unsigned long long x = (unsigned long long) -1;
更容易,对吗? =)。其次,您告诉printf()
将给定变量解释为带长签名的长十进制小数。试试这个:
unsigned long long x = (unsigned long long) -1;
printf("%llu", x);
%llu
表示“长期未签名”。
答案 3 :(得分:2)
unsigned long long ulTestMax = -1;
printf ("max unsigned long long = %llu\n", ulTestMax );
这适用于C ++,也应该在这里工作。
答案 4 :(得分:0)
对Kiril Kirov做过-1的人请看看这里:
Is it safe to use -1 to set all bits to true? Dingo帖子
在Kiril帖子中,只需要对符号扩展稍作修改:
unsigned long long ulTestMax = -1LLu;
-1是反模式,如果您不想使用lmits.h提供的解决方案,它将完成工作