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

如何在C中显示无符号long的最大值?,c,types,long-integer,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 unsign

我做错了什么

$ 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
$ 
$cat size.c
#包括
#包括
int main(){
printf(“sizeof unsigned int=%d字节。\n”,sizeof(unsigned int));
printf(“sizeof unsigned long=%d字节。\n”,sizeof(unsigned long-long));
printf(“最大无符号整数=%d\n”,(整数)(pow(2,32)-1));
printf(“max unsigned long-long=%lld\n”,(unsigned long-long)(pow(2,64)-1));
}
$gcc尺寸。c-o尺寸
美元/尺码
sizeof unsigned int=4字节。
sizeof unsigned long=8字节。
最大无符号整数=2147483647
最大无符号长=-1
$ 
我希望输出为
18446744073709551615
,而不是最后一行的
-1



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

使用
%llu
,而不是
%lld
d
表示有符号整数,因此
printf
将其显示为有符号的long-long。

只是不要假设它有特定的值。请使用
ULLONG\u MAX
编辑:根据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
表示“长未签名”


这是C++的工作,也应该在这里工作。< /P> < P>谁做了1 Kiril Kirov后,请看这里:< /P> 野狗驿站

在Kiril post中,仅需对标志扩展进行轻微修改:

unsigned long long ulTestMax = -1LLu; 

-1是反模式的,如果您不想使用lmits提供的解决方案,它将完成此任务。h

\include
与其他宏一起获取此宏。就像
LLONG_MAX
LLONG_MIN
一样。实际上,这应该是
~0LLu
实际上,gcc自己就知道了。@Santiago:gcc在这里什么都不知道-如果没有
llu
后缀,它只有在
~0=-1
的情况下才能正常工作;强制转换
-1
实际上是获得任何无符号类型的最大值的首选(可移植)方法,即
x=(无符号长)-1
;如果您的警告级别较低,则不需要显式强制转换。因为强制转换很难看。只需编写
-1all
。不需要强制转换,使用
-1
是完全有效的。该标准规定,
int
将首先扩展为
long
,然后转换为
long-long unsigned
(这不是标准化的,但总是可以转换)。这与将
(long-long-unsigned)-1放在第一位是一样的。假设底层架构使用了两种类型,long-long也不是标准类型(我记得它是gnu扩展)而且也不能保证它是正确的64bit@Nathan:根据C标准(特别是C99 6.3.1.3§2),将
-1
强制转换为无符号整数类型保证产生最大值@Nathan:你错了。这与twos补码无关,只与无符号值的严格定义行为有关。
unsigned long long ulTestMax = -1LLu;