这是错误的在MSDN文档

Is this wrong in MSDN document?

本文关键字:MSDN 文档 错误      更新时间:2023-10-16

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

它说:Unsigned int: 4byte取值范围0到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 %dn",sum); 
    sum = sum -1 ;     //2^31-1 represent by 0 followed by 31 1s
    printf("sum is %dn",sum);
    getchar();
} 

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

文档是正确的。

-2147483648到2147483647 (231 - 1)是带符号的 int的范围。

0到4294967295 (232 - 1)是unsigned int的取值范围。

%u代替%d

printf("sum is %un",sum);

参见printf Type Field Characters

这是不正确的,如果你想得到4b你应该做

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

或者

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

这将为您提供unsigned int类型的正确最大值(尽管有点粗糙)。另外,正如其他人指出的那样,您应该在printf中使用%u作为格式化器,以便正确解释值。

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

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

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

如果对unsigned int执行0xFFFFFFFF + 1操作,将会出现溢出(转储多余的位),结果变量为0。