已经提出了很多类似的问题,但它仍然让我感到困惑
unsigned int a = -1;
int b = ~0;
if (a == b)
printf("%u\t%d", a, b);
返回
4294967295 -1
我了解这些值是如何存储在C中的,以及它显示这些数字的原因,但我的问题是,a==b
如何在此处返回true
?
答案 0 :(得分:3)
根据混合有符号无符号比较规则,a == b
等同于a == (unsigned) b
,即比较是在无符号类型的域中执行的。
~0
的结果是全1位模式。在有符号整数类型中,此模式在2的补码平台上表示-1
。这意味着您使用b
初始化了-1
(由printf
确认)。
因此,您的比较实际上是(unsigned) -1 == (unsigned) -1
。难怪它成立。
但请记住,等式仍然依赖于实现,因为它取决于二进制补码表示的属性。只要C语言正式支持替代的有符号整数表示(符号和幅度,1的补码),相等就取决于它。