无符号-1 =有符号-1

时间:2016-12-03 06:58:30

标签: c unsigned-integer signed-integer

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

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

返回

  

4294967295 -1

我了解这些值是如何存储在C中的,以及它显示这些数字的原因,但我的问题是,a==b如何在此处返回true

1 个答案:

答案 0 :(得分:3)

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

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

因此,您的比较实际上是(unsigned) -1 == (unsigned) -1。难怪它成立。

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