0

已经问了很多类似的问题,但它仍然让我感到困惑

unsigned int a = -1;
int b = ~0;
if (a == b)
    printf("%u\t%d", a, b);

返回

4294967295 -1

我了解这些值是如何存储在 C 中的以及为什么它会显示这些数字,但我的问题是,这里如何a==b返回true

4

1 回答 1

3

根据混合有符号-无符号比较的规则,a == b等价于a == (unsigned) b,即在无符号类型的域中进行比较。

结果~0是全1位模式。在有符号整数类型中,此模式表示-1在 2 的补码平台上。这意味着您初始化了您b-1(由您的确认printf)。

所以,你的比较是有效的(unsigned) -1 == (unsigned) -1。难怪它是正确的。

但请记住,等式仍然依赖于实现,因为它取决于 2 的补码表示的属性。只要 C 语言正式支持替代有符号整数表示(符号和大小,1 的补码),相等性将取决于它。

于 2016-12-03T07:09:24.100 回答