c语言中关于值比较时需要注意的事项

本文通过一个具体的案例探讨了在C语言中进行值比较时可能遇到的问题,特别是当比较有符号与无符号整数时,可能会导致错误的结果。文章详细解释了问题的原因,并提出了注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c语言中关于值比较时需要注意的事项

tags: c 随笔


今天调试时,遇到一个问题,虽然非常非常简单也非常非常好排查,以至于以前都没有太在意这个问题。简要记录一下。

代码:

int recvLen = recvfrom(……);//recvfrom()为windows socket接收的API
if (recvLen > sizeof(SOCKET_MSG_HEAD)) {
    ……
}

这里面其实是有问题,由于一般自己写这种类似recvfrom,然后返回接收长度的函数在定义的时候都会刻意的把函数返回值定义为unsigned int类型,而recvfrom()的返回值微软定义的是一个有符号类型。

所以说当recvfrom返回-1的时候,recvLen就是大于sizeof(SOCKET_MSG_HEAD)的,因为sizeof()被认为是一个无符号整数,而有符号和无符号整数在比较时,编译器会把有符号数的符号忽略掉,直接拿内存里面存的实际值来比较,所以-1就是0xFFFFFFFF,所以就出现了上述问题。

总结下来:
1、有符号数和无符号数比较时,汇编代码被编译成无符号比较:

00402a26:   mov     -0x20(%ebp),%eax
00402a29:   cmp     -0x1c(%ebp),%eax
00402a2c:   jbe     0x4029da <SocketServerProc+272>

这样的比较在实际中应该避免或者禁止
2、sizeof()的结果编译器认为是无符号数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值