如何在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;