为什么不建议使用无符号整型,无符号整型能产生哪些bug?
《C专家编程》有这么几行代码。
#include一个数组,一个宏定义,宏的作用就是计算数组的元素个数。int array[] = {23, 34, 12, 17, 204, 99, 16}; #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) int main() { int d = -1, x; /* ... */ if (d <= TOTAL_ELEMENTS - 2) x = array[d + 1]; /* ... */ return 0; }
主函数里面d初始化成-1,判断语句中用 d 跟 TOTAL_ELEMENTS - 2做比较,如果成立,则给 x 赋值。
代码很简单,乍一看,-1 确实小于 5,于是判断语句肯定成立。
问题就出在了这边。
d属于有符号整型,TOTAL_ELEMENTS因为是sizeof的求值结果,所以它属于无符号整型,把这两个放在一起运算,很显然属于混合运算。
一个是有符号一个是无符号,编译器默认把有符号数转换成无符号数,接下来我们可以算一下。
-1的二进制是这样的:
10000000 00000000 00000000 00000001
因为负数在内存中是以补码的形式存放,所以先转换成反码,再转换成补码。
11111111 11111111 11111111 11111110 11111111 11111111 11111111 11111111
把它转换成无符号数字,就是最高位不再表示符号位,全部用来表示实际大小。
借助下计算器,-1转换成无符号数就是这么大:
4294967295
所以判断语句肯定不成立。
只要编译器的sizeof返回的是无符号整型,那么这个bug就一直存在。
对无符号类型的建议:
尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性。尤其是,不要仅仅因为无符号数不存在负值(如年龄、国债)而用它来表示数量。
尽量使用像 int 那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况(如 -1 被翻译为非常大的正数)。
只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号数或者无符号数,这样就不必由编译器来选择结果的类型。
嵌入式开发中使用无符号的场景很多,操作地址、寄存器等等,尤其是做单片机等等一些底层开发,随处可见 unsigned 字样,这也是由硬件特性决定。使用的时候多加注意,尤其是做一些基本运算的时候。
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
嵌入式
+关注
关注
4982文章
18281浏览量
288464 -
寄存器
+关注
关注
30文章
5028浏览量
117723 -
编程
+关注
关注
88文章
3440浏览量
92400 -
代码
+关注
关注
30文章
4555浏览量
66771
原文标题:为什么不建议使用无符号整型
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
急急急!!!如何设定列表框的输出为数组或无符号整型?
各位大神,我在前面板上选定了列表框,用创建属性节点的方法设置了列表框中的项目,然后设定选择模式为2(0 or more),输出应该是一维数组可为什么我把鼠标放在输出端时及时帮助显示还是有符号32位
发表于 11-09 17:33
BUG: 保存 字母的时候问题。但是保存各种符号的时候出现.....
本帖最后由 高顺周 于 2014-11-14 13:34 编辑
BUG: 保存 字母的时候问题。但是保存各种符号的时候出现.....目的:保存字符串到ACCESS数据库。现象:保存字母的时候
发表于 11-14 13:28
if不能判断有符号数的大小?编译器bug还是我bug了。。。
,所以不发生0xff。我怀疑是if不能判断正负,于是单独编写了一个函数测试,然后是能判断正负的。所以,我目前的程序出了bug了吗?有符号数的0xfe13绝对是个负数吧,那是哪里搞错了呢?求大神赐教,解决完这个问题好回家过中秋啊
发表于 09-14 10:23
嵌入式算法中浮点运算转化为无符号整形运算的问题!!
为什么很多嵌入式算法 都将浮点数转化为无符号整形,再进行运算,有些DSP自带浮点运算库的,但还是这样转换,本人初到,接触了一部分历程,有TI提供的,有大牛自己写的,感觉对IQmath不熟悉,但知道
发表于 04-26 20:07
是否可以获得两个无符号数之差的无符号结果?
嗨,可能是个愚蠢的问题。我有两个像这样的无符号变量(XC32):当在两个变量之间求差时,我得到一个有符号的结果(即,在某个点上可能有负值)。为了纠正这个问题,我得到了结果的绝对值。我的问题是:我
发表于 03-24 07:50
怎么通过FPGA向DSP发送有符号整型数据?
我用的是TL138EVM-F的开发板,在用FPGA和DSP通信的时候遇到点问题。我看了创龙的例程有UPP的外部回环测试,上板也验证成功了。我现在需要做的是通过FPGA向DSP发送有符号整型数据,再
发表于 04-01 10:27
隐式有符号到无符号转换
您好,我现在正在使用PIC16F18313,在代码中,我声明了一个变量,它位于我放入的示例代码中,问题是,我收到一个警告:隐式签名到无符号转换,我不知道是什么原因或者如何修复它。关于我的问题:希望你能得到一个很好的回答。谢谢。
发表于 04-07 14:06
整型数据在C语言中的分类
整型数据在C语言中,数据包含整型和浮点型两种数据,而浮点型又可以转换为二进制,最终所有数据都会变成二进制。补充:(不考虑有无符号)整型数据:int,short,long,long lo
发表于 11-08 07:36
无符号整形变量和一般整形变量的区别
1.在使用单片机的时候注意无符号整形变量和一般整形变量的区别2.进行比较的时候最好使用一般变量进行比较,如果原来变量是无符号变量最好将其进行强制类型转换,转换成。一般类型变量进行比较3
发表于 01-24 06:08
IAR警告:无符号整数与零的无意义比较是否合理?
;#123;}}问题无符号整型能赋值为0啊,为什么会与0比较无意义?按照警告去消除的话,就变为if(0 < x && x <= 100)
发表于 04-07 15:35
C++编程中整型数据在内存中存储是怎么样的
1.整型的归类 char short int long 以上都分为有符号(signed)与无符号(unsigned)的类型 2.原码、反码和补码 2.1 定义 计算机在表示一个数字时,是采用二进制
常见的PLC系统BUG有哪些?如何减少这些BUG的产生?
PLC系统可能会遇到各种不同类型的BUG,以下是一些常见的PLC系统BUG以及如何减少这些BUG的产生的建议: (1)逻辑错误:逻辑错误是最常见的PLC系统
常见的PLC系统BUG有哪些?如何减少BUG的产生呢?
PLC系统可能会遇到各种不同类型的BUG,以下是一些常见的PLC系统BUG以及如何减少这些BUG的产生的建议
java中长整型怎么定义
在Java中,长整型是一种数据类型,用于存储整数值。它的取值范围比整型要大,可以存储更大的整数值。长整型的大小为8字节,即64位。在Java中,长整型用关键字"long"进行声明和定义
评论