有符号与无符号比较
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
.
谁能解释一下这里发生了什么?我猜编译器将 a
和 b
转换为相同类型(unsigend int
可能)并比较它们。
让我们看看计算机如何存储值b:
5
是00000101
,所以-5
会是11111011
,所以,当你把它转换成unsigned char
,它就会变成一个正数,值为[=13] =] 二进制,大于 00000101
.
所以,这就是 a = 00000101
小于 b
的原因(0 表示错误)。
它正在打印 0
因为 a < b
和 0
表示错误。 b
的类型是 unsigned
所以它不能容纳负数。因为 -5
变成 251
比 5
.
让我们转到 main
中的第三行
c
取0
的值,因为a
不大于b
。这是因为在 C 语言中零被认为是假的,然后其他一切都是真的。
关于b
。大多数平台使用 2s 补码格式存储负整数。因此,当我们对一个数取反时,我们翻转所有位并加 1。因此 -5 unsigned 变为大于 5 的 0xfa。
#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
,它就会变成一个正数,值为[=13] =] 二进制,大于 00000101
.
所以,这就是 a = 00000101
小于 b
的原因(0 表示错误)。
它正在打印 0
因为 a < b
和 0
表示错误。 b
的类型是 unsigned
所以它不能容纳负数。因为 -5
变成 251
比 5
.
让我们转到 main
中的第三行
c
取0
的值,因为a
不大于b
。这是因为在 C 语言中零被认为是假的,然后其他一切都是真的。
关于b
。大多数平台使用 2s 补码格式存储负整数。因此,当我们对一个数取反时,我们翻转所有位并加 1。因此 -5 unsigned 变为大于 5 的 0xfa。