c - 无符号 -1 = 有符号 -1

标签 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

最佳答案

根据混合有符号无符号比较的规则,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/

相关文章:

c - 为什么在 C 中将编译和链接过程分开很重要?

c - '*' 的类型参数无效(有 'double' )C

c - 当 R.H.S 在算术运算中有 int 范围外的 negative int 和 unsigned int

php - 将 unix 时间戳存储为无符号整数会有什么好处吗?

c - 如何通过控制台通过互联网发送数据

c - 在 C 中使用函数指针数组时出现段错误

c++ - 编译器错误 : Invalid Conversion from int* to unsigned int* [-fpermissive]

java - 在java中将两个字节转换为有符号整数

c++ - intptr_t 有什么用?