#include <iostream>
int main()
{
signed int a = 5;
unsigned char b = -5;
unsigned int c = a > b;
std::cout << c << std::endl;
}
此代码打印0
.
谁能解释一下这里发生了什么?我猜编译器将a
和b
转换为相同的类型(unsigend int
也许(并进行比较。
让我们看看计算机如何存储值 b:
5
是00000101
,所以-5
会被11111011
,所以当你把它转换成unsigned char
时,它会变成一些值11111011
二进制的正数,大于00000101
。
所以,这就是为什么a = 00000101
小于b
(0 表示假(。
它正在打印0
,因为a < b
和0
表示假。 b
的类型是unsigned
的,因此它不能容纳负数。 正因为如此,-5
变得251
比5
更刨丝。
让我们转到main
中的第三行 c
取0
的值,因为a
不大于 b
。这是因为在 C 中零被认为是假的,而其他一切都是真的。
关于b
.大多数平台使用 2s 补码格式存储负整数。因此,当我们否定一个数字时,我们翻转所有位并添加 1。所以 -5 无符号变为大于 5 的0xfa。