原创 有符号数与无符号数比较语句中隐晦的BUG

2011-1-19 20:59 4240 14 15 分类: 消费电子

<论题>
论题如文章标题, 以下为实例解释:

<实例解释>
typedef unsigned int        U32;          
typedef signed   int        S32;

<1> 典型错误:

        U32 x = 1;
        if(-1 > x)
            uart0_putnum(0xaa, 0x10);
        else
            uart0_putnum(0xbb, 0x10);

结果: 返回值并非为 0xbb, 而是 0xaa.
提示: 编译器给出该错误语法的提示: "Warning[Pe068]: integer conversion resulted in a change of sign".
注释: 编译器使用 IAR.

<2> 更隐蔽的错误:

        S32 a = -1;
        U32 x = 1;
        if(a > x)
            uart0_putnum(0xaa, 0x10);
        else
            uart0_putnum(0xbb, 0x10);

结果: 返回值仍然是意外的 0xaa.
提示: 此时编译器无任何警告错误, 这个bug 编译器无法识别.

<3> Fix:

        S32 a = -1;
        U32 x = 1;
        if(a > (S32)x)
            uart0_putnum(0xaa, 0x10);
        else
            uart0_putnum(0xbb, 0x10);

方式: 强制无符号整数类型为有符号整数, 在同为有符号整数类型下, 再次进行比较.
结果: 返回值为正确的 0xbb.

<结论>
一个很小的知识点, 隐藏一个编译器无法识别的bug. 在编写C代码时, 工程师应自行注意类型不同时, 应使用强制类型, 进行比较语句.

Allen
2011.01.19 作于深圳

文章评论1条评论)

登录后参与讨论

allen_zhan_752827529 2011-10-8 17:01

略微深入的讨论是: 在进行运算时, 不同类型的数据要先转换成同一类型, 然后进行运算. 不同数据类型拥有不同的优先级. unsigned 的优先级高于 int, 既是 U32 的优先级 高于 S32 我们可以合理的假设: 在关系运算符 if(-1 > x) 进行运算时, 我们可以假设 -1 从 S32 -> U32, -1 的补码是一个大的正正数. 故该关系运算符得到的结果是 TRUE. 而我们的 FIX 的方式, 从这个分析来理解, 就是防止 S32 数据类型被转换成更高的数据类型 U32.
相关推荐阅读
allen_zhan 2023-02-27 19:08
对"三极管"译名由来的探讨
想讨论一个有意思的话题:今天中国大陆的电子业界, 为何将 BJT 称呼为 "三极管"? 或因其象形, 前辈自行进行随意的不严谨定义么? 带着疑问我们做了一下延伸查阅, 或得出这样的结论, 即中译名"三...
allen_zhan 2023-02-19 18:15
对知乎提问"为何三极管的一个PN结工作在反偏"的回复
将这个回复, 也发表在博文中, 作为自己的一个学习笔记叭.知乎问题: "三极管里面的PN结相当于二极管,为什么里面PN结加反向电压也能导通?"我的回复:首先, 二极管的"反向"概念, 容易给初学者某种...
allen_zhan 2023-02-18 10:17
从肖特基二极管到PN结与三极管
最近数个工作日的兴趣是回顾电子基础器件的发明/发展历史, 期待夯实技术基础的底蕴. 在学习与搜索资料的过程中, 顺便对知乎的一个同学的基础问题, 进行了回复. 不小心回复一下就成了千字文, 觉得挺有趣...
allen_zhan 2023-01-28 11:53
微功率 ISM 频率探讨相关文档组总结
不知不觉, 自开启关于微功率频率的话题起, 即从第一份文章写就到今天总结之日, 已经接近 10 个工作日左右. 早先的想法是对工程界未来的微功率设备相关项目, 从项目规划开始, 对选择系统, 频率, ...
allen_zhan 2023-01-27 22:50
关于 LoRa 应用场景的讨论
说明: 本文中斜体部分表示来自公告文件的部分内容剪贴或合并整理.1. "第52号文" 对 470MHz 的约束引自 如下:(四)民用计量仪表限在建筑楼宇、住宅小区及村庄等小范围内组网应用,任意时刻限...
allen_zhan 2023-01-25 13:24
ISM 频段中 2.4G 与 5.8GHz 设备的使用与限制
说明: 本文中斜体部分表示来自公告文件的部分内容剪贴或合并整理.1. ISM 频段定义中的 2.4G 与 5.8GHz正如同 文中确定的, 2.4G, 5.8GHz 属于中国大陆 ISM 频段的定义...
我要评论
1
14
关闭 站长推荐上一条 /2 下一条