【问题标题】:Signed vs Unsigned comparison有符号与无符号比较
【发布时间】:2015-06-25 11:53:12
【问题描述】:
#include <iostream>

int main()
{
    signed int a = 5;
    unsigned char b = -5;
    unsigned int c = a > b;

    std::cout << c << std::endl;
}

此代码打印0

谁能解释一下这里发生了什么?我猜编译器会将ab 转换为相同类型(可能是unsigend int)并进行比较。

【问题讨论】:

标签: c++ compare unsigned signed


【解决方案1】:

让我们看看计算机如何存储值 b:
500000101,所以 -5 将是 11111011,所以,当你将它转换为 unsigned char 时,它会变成一些正数二进制值11111011的数字,大于00000101
所以,这就是a = 00000101 小于b 的原因(0 表示错误)。

【讨论】:

  • 请引用规定这种行为的标准来源。
【解决方案2】:

它正在打印0,因为a &lt; b0 表示错误。 b 的类型是 unsigned,所以它不能包含负数。因为-5 变成了251,这比5 要好。

【讨论】:

    【解决方案3】:

    让我们转到main 中的第三行 c0 的值,因为a 不大于b。这是因为在 C 中,零被认为是假的,而其他一切都是真的。

    关于b。大多数平台使用 2s 补码格式存储负整数。因此,当我们对一个数字求反时,我们将所有位翻转并加 1。所以 -5 无符号变为 0xfa,大于 5。

    【讨论】:

      猜你喜欢
      • 2011-07-21
      • 2016-08-07
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 2019-07-11
      相关资源
      最近更新 更多