3

我以为结果会是(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

4 回答 4

9

您使用了错误的格式字符串。%d是有符号的十进制整数。你应该使用%u.

printf不知道您传递给它的变量的类型。您可以选择正确的格式字符串。

于 2012-07-17T01:54:32.927 回答
5

您要求printf()将该值解释为有符号整数,其范围为-(2**31)to (2**31)-1。基本上,高位是符号位。阅读二进制补码

于 2012-07-17T01:53:41.207 回答
1

格式说明%d符用于打印有符号整数,并且由于您传入0xffffffffprintf因此正确输出-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.

于 2020-05-13T02:25:03.423 回答
0

因为 %d 代表有符号整数。对于有符号整数,当整数为负时设置高位(第 32 位),或视情况而定。在 0xFFFFFFFF 中设置了高位,因此当转换为有符号整数时,结果为负。要将高位视为数字本身的一部分,请使用无符号类型

%lu or %u 
于 2012-07-17T01:55:44.317 回答