<分区>
类似的问题已经问了好几个了,但是还是很迷惑怎么问
unsigned int a = -1;
int b = ~0;
if (a == b)
printf("%u\t%d", a, b);
返回
4294967295 -1
我了解这些值如何存储在 C 中以及它为什么显示这些数字,但我的问题是,a==b
如何在此处返回 true
?
<分区>
类似的问题已经问了好几个了,但是还是很迷惑怎么问
unsigned int a = -1;
int b = ~0;
if (a == b)
printf("%u\t%d", a, b);
返回
4294967295 -1
我了解这些值如何存储在 C 中以及它为什么显示这些数字,但我的问题是,a==b
如何在此处返回 true
?
最佳答案
根据混合有符号无符号比较的规则,a == b
等价于a == (unsigned) b
,即比较在无符号类型。
~0
的结果是全 1 位模式。在有符号整数类型中,此模式表示 2 的补码平台上的 -1
。这意味着您使用 -1
初始化了您的 b
(由您的 printf
确认)。
因此,您的比较实际上是 (unsigned) -1 == (unsigned) -1
。难怪它是正确的。
但请记住,相等性仍然取决于实现,因为它取决于 2 的补码表示的属性。只要 C 语言正式支持替代有符号整数表示(符号和大小,1 的补码),相等性将取决于它。
关于c - 无符号 -1 = 有符号 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40945150/