0

这是来自http://msdn.microsoft.com/en-us/library/s3f49ktz(v=VS.80).aspx的 MSDN 链接

它说: unsigned int : 4byte Range of Value 0 to 4,294,967,295

因此我的测试代码:

void main(void) 
{       
    unsigned int sum;   //4byte, 32bit
    sum = 2147483648;  //2^31 represent by 1 followed by 31 0s
    printf("sum is %d\n",sum); 
    sum = sum -1 ;     //2^31-1 represent by 0 followed by 31 1s
    printf("sum is %d\n",sum);
    getchar();
} 

我确定 4,294,967,295=2^32-1,printf 将打印“0”,转储最高有效位我认为 MSDN 应该写值范围:0 到2147483647 对吗?

4

3 回答 3

6

文档是正确的。

-2147483648 到 2147483647 (2 31 - 1) 是有符号整数的范围。

0 到 4294967295 (2 32 - 1) 是无符号整数的范围。

使用%u代替%d

printf("sum is %u\n",sum);

请参阅printf 类型字段字符

于 2011-08-06T06:41:36.460 回答
2

那是不正确的,如果您想获得4b,您应该这样做

unsigned int sum;
sum = 0;
sum -= 1;

或者

unsigned int sum = -1; // will give the same result

这应该为您提供 unsigned int 的正确最大值(尽管如此)。同样正如其他人指出的那样,您应该使用 %u 作为 printf 中的格式化程序,以便正确解释该值。

无符号整数使用所有位作为幅度位,因此前导位不再被视为符号位,因此变为 2^32 - 1 而不仅仅是 2^31 - 1

于 2011-08-06T06:42:45.283 回答
0

正如 Sander 提到的,您需要使用%u而不是%d因为您正在查看无符号整数而不是有符号整数。

负数使用二进制补码存储,其中 -1 = 0xFFFFFFFF,-2 = 0xFFFFFFFE,依此类推到 -2^32 = 0x80000000。

如果你对一个无符号整数执行 0xFFFFFFFF + 1,你会得到一个溢出(转储额外的位),结果变量为 0。

于 2011-08-06T06:53:54.813 回答