当有符号数和无符号数比较的时,如果有符号数的类型低于无符号数的类型,会发生类型提升,要当心。
只要有一个操作数是无符号数,另一个也会被转成无符号数,这种说法是不对的;理由是,实际的转换是按类型大小关系进行的,但并不是所有的无符号数都高于有符号数。long long 类型就高于 unsinged int 类型。
#include <stdio.h>
int main(void)
{
// 正常情况下 -1 < 10 为真
// 1. 陷阱示例
int x = -1;
unsigned int y = 10;
printf("-1 < (unsigned)10 ? ");
// 期望此 x < y 成立;但实际为假
if (x<y){
// 因为 -1 会提升为无符号数,于是此条件不成立
puts("yes");
}else{
puts("no");
}
// 2. 陷阱反例:不能认为凡是有符号数遇到无符号数就都会变成无符号数
long long a = -1;
unsigned int b = 10;
if (a < b){
puts("yes");
}else{
// 这两种都会被转成 long long,实际执行的仍然是有符号比较,结果仍然是 a<b
puts("no");
}
// 3. 这次的结果要视编译器环境而定。
long s = -1;
unsigned int t = 10;
if (s<t) puts("Yes");
else puts("No");
// long 高于 uint,但 long 和 int 一样长时,uint 高于 long;
// LLP64,ILP32,ILP64 上,int 和 long 一样长,所以 uint 高于long
// 64位Windows是LLP64模型;
// LP64 上,long 高于 int,64位Linux机器是 LP64 模型
}
警觉心触发条件:只要遇见无符号数参与比较就要当心。两个都是无符号数的除外。
除非有足够的理由和把握,否则不要写出无符号数和有符号数进行大小比较的语句。

本文介绍了C语言中无符号数和有符号数进行比较时的潜在陷阱,强调了类型提升的规则并不总是将有符号数转换为无符号数,而是根据类型大小进行转换。当遇到这种情况时需要谨慎处理,特别是当有符号数与无符号数混合比较时,除非有明确需求,否则应避免这样的比较操作。
1646

被折叠的 条评论
为什么被折叠?



