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()的结果编译器认为是无符号数。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐