有符号与无符号比较

Signed vs Unsigned comparison

#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 可能)并比较它们。

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

它正在打印 0 因为 a < b0 表示错误。 b 的类型是 unsigned 所以它不能容纳负数。因为 -5 变成 2515.

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

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