c语言中关于值比较时需要注意的事项
2017-11-24 18:50
155 查看
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()的结果编译器认为是无符号数。
相关文章推荐
- 在C语言中关于scanf()函数需要注意的一些事项
- 关于c语言中的运算符及注意事项
- c语言 关于数组 我们需要注意什么
- 关于docker几个需要注意的事项
- Linux下关于动态库调用动态库及编译需要注意的事项
- 使用php mongodb扩展时比较需要注意的事项
- 关于Loaderunner安装和卸载需要注意的事项
- 关于C语言程序编写需要注意事项大家给点意见
- linux 串口 c语言编程需要注意的事项
- java关于字符串比较的注意事项
- 关于内存对齐,写代码中需要注意的事项
- c#中关于compare比较的一点注意事项
- 关于addSubView需要注意的事项 -今天吃了一个大亏
- 关于 System.IO.File.Exists 需要注意的事项
- 关于C语言中自增和自减运算符的使用及注意事项
- C#项目关于程序中使用管理员权限的程序的打包,需要注意的事项
- 关于文章“cocos2dx移植android平台-我的血泪史”需要注意事项
- Objective-C语言中隐式循环与需要注意的事项
- 关于c语言变量定义的注意事项
- 关于文章“cocos2dx移植android平台-我的血泪史”需要注意事项