如何在C语言中显示无符号长整型的最大值?

16

我在这里做错了什么?

$ 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


好的,我完全没有意识到我得到的232 - 1的值是错误的,应该是4294967295,而不是2147483647。现在事情更加合理了。

5个回答

29

不要以为它有一定的值,使用 ULLONG_MAX


15
要获取此宏以及其他宏(例如LLONG_MAXLLONG_MIN),请包含头文件<limits.h> - wkl

19

使用%llu而不是%lldd用于有符号整数,因此printf将其显示为有符号的长长整型。


3

编辑:根据Christoph的建议,将 ~0 更改为 (type) -1。请参见下面的评论。

您可以通过以下方式获取无符号类型的最大值:

unsigned long long x = (unsigned long long) -1;

更简单了,对吧?=) 其次,你告诉printf()将给定的变量解释为带符号的长整型十进制数。请改为以下方式:
unsigned long long x = (unsigned long long) -1;
printf("%llu", x);

%llu意味着“长长的无符号”。


2
实际上应该是 ~0LLu - Šimon Tóth
实际上,gcc自己就能解决这个问题。 - salezica
2
@Santiago:gcc 在这里并没有解决任何问题 - 如果没有 llu 后缀,它只有在 ~0 == -1 的情况下才能按预期工作;将 -1 强制转换实际上是获取任何无符号类型的最大值的首选(且可移植)方法,即 x = (unsigned long long)-1;如果您的警告级别足够低,则不需要显式转换。 - Christoph
1
强制类型转换很丑陋。直接写成"-1ULL"即可。 - R.. GitHub STOP HELPING ICE
1
强制转换并不是必要的,使用“-1”是完全有效的。标准规定,“int”将首先扩展为“long long”,然后转换为“long long unsigned”(这并没有标准化,但总是愉快地转换)。这与一开始放置“(long long unsigned) -1”是相同的。 - Matt Joiner
显示剩余5条评论

2
unsigned long long ulTestMax = -1;
printf ("max unsigned long long = %llu\n", ulTestMax );

这在C++中可行,应该也在这里可行。


假设底层架构使用二进制补码。 - Nathan Fellman
另外,long long 不是标准类型(据我所记,它是 GNU 扩展),并且不能保证它是 64 位的。 - Kiril Kirov
7
@Nathan:将-1转换为无符号整数类型可以保证按照C标准(具体来说,是C99 6.3.1.3 §2)的规定产生最大值。 - Christoph
1
@Nathan:你错了。这与二进制补码无关,只与无符号值的严格定义行为有关。 - R.. GitHub STOP HELPING ICE

1

谁曾对Kiril Kirov的帖子进行了-1操作,请看这里:

使用-1设置所有位为true是否安全?Dingo的帖子

在Kiril的帖子中,只需要稍作修改即可涉及符号扩展:

unsigned long long ulTestMax = -1LLu; 

-1是反模式,如果您不想使用lmits.h提供的解决方案,它可以完成工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接