【发布时间】:2014-02-07 12:20:51
【问题描述】:
我正在使用 K&R 书学习 c 语言。在第二章书中,作者谈到了隐式转换。书上是这么说的:
当涉及无符号操作数时,转换规则更加复杂。问题是 有符号和无符号值之间的比较取决于机器,因为它们取决于各种整数类型的大小。例如,假设 int 为 16 位,long 为 32 位。然后 -1L 1UL,因为 -1L 被提升为 unsigned long,因此看起来是一个很大的正数。
我在两种不同的场景下尝试了下面的代码:
- 在 x86 64 位平台上编译并执行。其中
sizeof(-1L)-> 8 字节和sizeof(1U)-> 4 字节 - 在 x86 32 位平台上编译并执行。其中
sizeof(-1L)-> 4 字节和sizeof(1U)-> 4 字节
代码:
int main() {
if(-1L > 1U)
printf("true");
else
printf("false");
return 0;
}
结果:
- x86 64 位:
false - x86 32 位:
true
所以我在每种情况下都会得到两个不同的 OP。
正如作者所说,对于 2 种不同的数据大小,一种是 16,另一种是 32,它适用于我的 x86-64 案例。
但我无法理解为什么在 32 位的第二种情况下,我得到true。
正如作者所说,unsigned int 被提升为signed long int,如果这是真的,那么两者
应该是 4 字节宽,那为什么打印 true 而不是 false?现在两者都应该是signed long。
正如作者所说,它依赖于机器,那么long 和int 应该具有相同的字节大小,那么这里的隐式转换是如何发生的?
我的理解是-1 存储为二进制补码即 0xFFFFFFFF > 0x1 所以在第二种情况下它应该是true。
但这种解释与第一种情况相矛盾。
如果我认为是错误的,请纠正我,因为我是隐式转换的新手。
谁能解释一下这种行为?
【问题讨论】:
-
不应该
-1L > 1LU在这两种情况下都评估为真? -
抱歉错字不是 1LU 而是 1U
标签: c implicit-conversion