我以为结果会是(2**32 - 1)
#include <stdio.h>
int main(){
unsigned int a = 0xffffffff;
printf("the size of int a %d\n",a);
return 0;
}
但它给了我-1
,有什么想法吗?
我以为结果会是(2**32 - 1)
#include <stdio.h>
int main(){
unsigned int a = 0xffffffff;
printf("the size of int a %d\n",a);
return 0;
}
但它给了我-1
,有什么想法吗?
您使用了错误的格式字符串。%d
是有符号的十进制整数。你应该使用%u
.
printf
不知道您传递给它的变量的类型。您可以选择正确的格式字符串。
您要求printf()
将该值解释为有符号整数,其范围为-(2**31)
to (2**31)-1
。基本上,高位是符号位。阅读二进制补码。
格式说明%d
符用于打印有符号整数,并且由于您传入0xffffffff
,printf
因此正确输出-1
.
问题是说明%d
符用于有符号整数。你需要使用%u
.
printf("%d",0xffffffff); // Will print -1
printf("%u",0xffffffff); // Will print 4294967295
By the way, I would expect to see a compiler warning here -- something along the lines of "printf() expects int value but argument has unsigned long int type", because most compilers detect the type mismatch.
因为 %d 代表有符号整数。对于有符号整数,当整数为负时设置高位(第 32 位),或视情况而定。在 0xFFFFFFFF 中设置了高位,因此当转换为有符号整数时,结果为负。要将高位视为数字本身的一部分,请使用无符号类型
%lu or %u