如何在C中显示无符号长long的最大值?

时间:2010-10-09 20:17:51

标签: c types long-integer

我在这里做错了什么?

$ 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.现在事情变得更有意义了。

5 个答案:

答案 0 :(得分:28)

不要以为它具有使用ULLONG_MAX

的特定值

答案 1 :(得分:19)

使用%llu,而不是%lldd用于有符号整数,因此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提供的解决方案,它将完成工作