我认为结果是(2**32 - 1)
#include <stdio.h>
int main(){
unsigned int a = 0xffffffff;
printf("the size of int a %d\n",a);
return 0;
}
但它给了我-1
,任何想法?
答案 0 :(得分:7)
您使用的是错误的格式字符串。 %d
是带符号的十进制int。您应该使用%u
。
printf
不了解您传递的变量类型。您可以选择正确的格式字符串。
答案 1 :(得分:3)
您要求printf()
将该值解释为有符号整数,其范围为-(2**31)
到(2**31)-1
。基本上,高位是符号位。阅读two's complement。
答案 2 :(得分:0)
因为%d表示有符号整数。对于有符号整数,当整数为负时,设置高位(第32位),否则视情况而定。在0xFFFFFFFF中,高位被置位,因此当转换为有符号整数时,结果为负。要将高位视为数字本身的一部分,请使用无符号类型
%lu or %u
答案 3 :(得分:-1)
%d
格式说明符用于打印有符号整数,由于您传入0xffffffff
,因此printf
正确地输出了{{1} }。
问题在于-1
说明符用于带符号整数。您需要使用%d
。
%u
顺便说一句,我希望在这里看到编译器警告-类似于“ printf()需要int值,但参数具有无符号long int类型” 的东西,因为大多数编译器都会检测到类型不匹配。