C语言有符号数和无符号数进行比较的陷阱

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

当有符号数和无符号数比较的时,如果有符号数的类型低于无符号数的类型,会发生类型提升,要当心。
只要有一个操作数是无符号数,另一个也会被转成无符号数,这种说法是不对的;理由是,实际的转换是按类型大小关系进行的,但并不是所有的无符号数都高于有符号数。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 模型
}

警觉心触发条件:只要遇见无符号数参与比较就要当心。两个都是无符号数的除外。
除非有足够的理由和把握,否则不要写出无符号数和有符号数进行大小比较的语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值