c语言中关于值比较时需要注意的事项
来源:互联网 发布:ysl 口红 知乎 编辑:程序博客网 时间:2024/06/07 05:22
c语言中关于值比较时需要注意的事项
tags: c 随笔
今天调试时,遇到一个问题,虽然非常非常简单也非常非常好排查,以至于以前都没有太在意这个问题。简要记录一下。
代码:
int recvLen = recvfrom(……);//recvfrom()为windows socket接收的APIif (recvLen > sizeof(SOCKET_MSG_HEAD)) { ……}
这里面其实是有问题,由于一般自己写这种类似recvfrom,然后返回接收长度的函数在定义的时候都会刻意的把函数返回值定义为unsigned int类型,而recvfrom()的返回值微软定义的是一个有符号类型。
所以说当recvfrom返回-1的时候,recvLen就是大于sizeof(SOCKET_MSG_HEAD)的,因为sizeof()被认为是一个无符号整数,而有符号和无符号整数在比较时,编译器会把有符号数的符号忽略掉,直接拿内存里面存的实际值来比较,所以-1就是0xFFFFFFFF,所以就出现了上述问题。
总结下来:
1、有符号数和无符号数比较时,汇编代码被编译成无符号比较:
00402a26: mov -0x20(%ebp),%eax00402a29: cmp -0x1c(%ebp),%eax00402a2c: jbe 0x4029da <SocketServerProc+272>
这样的比较在实际中应该避免或者禁止
2、sizeof()的结果编译器认为是无符号数。
阅读全文
0 0
- c语言中关于值比较时需要注意的事项
- 在C语言中关于scanf()函数需要注意的一些事项
- linux 串口 c语言编程需要注意的事项
- 关于内存对齐,写代码中需要注意的事项
- 关于购买商品房时需要注意的事项
- 关于苹果ios注册账号时需要注意的事项
- 关于 HTML5 你需要注意的事项
- 关于docker几个需要注意的事项
- C编程需要注意的诸多事项
- C语言中getchar使用注意的事项
- JS中alert调试时需要注意的事项
- mybatis中xml文件编写时需要注意的事项
- mybatis中xml文件编写时需要注意的事项
- Aix中crontab需要注意的事项
- SEO中需要注意的事项
- 搭建论坛时需要注意的事项
- 使用UNICODE时需要注意的事项
- bootstrapvalidator使用时需要注意的事项
- python 集合
- mysql 5.7修改密码
- hdu 2049
- multimap的简单使用 一道数据输入,查询的问题
- 转载:WebSocket 原理介绍及服务器搭建
- c语言中关于值比较时需要注意的事项
- storm配置文件
- socket的局域网广播
- 深入理解BootStrap -- 标签(label)与徽章(badge)
- linux shell awk常用函数积累
- maven POM.xml 标签详解
- 1118的相应代码以及斐波那契函数
- 逆转一个字符串
- 数组排序算法