我所说的“直觉”是指给定的
int a = -1;
unsigned int b = 3;
表达式(a < b)
应计算为 1。
Stackoverflow 上有很多问题已经在询问为什么在这种或那种特殊情况下 C 编译器会抱怨有符号/无符号比较。答案归结为整数转换规则等。然而,在比较有符号整数和无符号整数时,为什么编译器必须如此愚蠢,似乎没有任何理由。使用上面的声明,为什么表达式喜欢
(a < b)
不会自动替换为
(a < 0 || (unsigned int)a < b)
如果没有单一的机器指令可以正确执行?
现在,有一些关于“如果你必须混合有符号和无符号整数,你的程序有问题”的问题的评论。我不会买这个,因为 libc 本身就不可能生活在一个只有签名或无符号的世界中(例如sprintf()
,函数系列的示例返回int
为写入的字节数,send()
返回ssize_t
等等)。
我也不认为我可以接受下面评论中表达的想法,即有符号整数到无符号的隐式转换(“成语”)与显式强制转换( )(d - '0' < 10U)
相比赋予了 C 程序员一些额外的权力。但可以肯定的是,它打开了广泛的搞砸的机会。((unsigned int)(d - '0') < 10U)
是的,我很高兴编译器警告我它不能这样做(不幸的是,只有当我明确询问时)。问题是——为什么不能呢?通常标准规则背后有充分的理由,所以我想知道这里是否有任何理由?