为什么在C中将0xffffffff转换为十进制为-1?

时间:2012-07-17 01:51:42

标签: c

我认为结果是(2**32 - 1)

#include <stdio.h>
int main(){
  unsigned int a = 0xffffffff;
  printf("the size of int a %d\n",a);
  return 0;
}

但它给了我-1,任何想法?

4 个答案:

答案 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类型” 的东西,因为大多数编译器都会检测到类型不匹配。