【问题标题】:Is this wrong in MSDN document?这是 MSDN 文档中的错误吗?
【发布时间】:2011-08-06 06:39:31
【问题描述】:

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

它说: 无符号整数:4字节 值范围 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 %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 对吗?

【问题讨论】:

  • 使用%u 而不是%d。后者用于打印带符号的 int。
  • 您可能想使用%u 而不是%d,因为您正在尝试打印unsigned int。我认为这会消除你的一些困惑。
  • 不,unsigned int 使用它的所有位。没有一个被“倾倒”。
  • 这也许是一个更好的例子:ideone.com/rSR0C
  • main 返回一个int。需要明确的是,MSDN 信息适用于特定的编译器和平台,所以这并不是普遍适用的。

标签: c++ c microprocessors


【解决方案1】:

文档是正确的。

-2147483648 到 2147483647 (231 - 1) 是 signed int 的范围。

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

使用%u 而不是%d

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

printf Type Field Characters

【讨论】:

  • -2147483648 到 2147483647 是有符号整数的范围。
  • @Mitch,你的答案是正确的,但如果他想打印 unsigned int 的最大值,他的值是错误的。我不太确定他想在那里做什么。
【解决方案2】:

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

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

或者

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

这应该为您提供无符号整数的正确最大值(尽管如此骇人听闻)。此外,正如其他人指出的那样,您应该在 printf 中使用 %u 作为格式化程序,以便正确解释值。

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

【讨论】:

  • 你为什么不简单地写这个>>unsigned int sum = -1?
  • @Nawaz:因为他写的方式相同(虽然数字不同)
【解决方案3】:

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

使用two's complement 存储负数,其中-1 = 0xFFFFFFFF,-2 = 0xFFFFFFFE,依此类推到-2^32 = 0x80000000。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多