0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

无符号整型能产生哪些bug?

学益得智能硬件 来源:学益得智能硬件 2023-11-09 17:09 次阅读

为什么不建议使用无符号整型,无符号整型能产生哪些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就一直存在。 344f75b8-7edf-11ee-939d-92fbcf53809c.png  

对无符号类型的建议:

尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性。尤其是,不要仅仅因为无符号数不存在负值(如年龄、国债)而用它来表示数量。

尽量使用像 int 那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况(如 -1 被翻译为非常大的正数)。

只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号数或者无符号数,这样就不必由编译器来选择结果的类型。



嵌入式开发中使用无符号的场景很多,操作地址、寄存器等等,尤其是做单片机等等一些底层开发,随处可见 unsigned 字样,这也是由硬件特性决定。使用的时候多加注意,尤其是做一些基本运算的时候。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19093

    浏览量

    304611
  • 寄存器
    +关注

    关注

    31

    文章

    5334

    浏览量

    120208
  • 编程
    +关注

    关注

    88

    文章

    3609

    浏览量

    93680
  • 代码
    +关注

    关注

    30

    文章

    4774

    浏览量

    68503

原文标题:为什么不建议使用无符号整型

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    急急急!!!如何设定列表框的输出为数组或符号整型

    各位大神,我在前面板上选定了列表框,用创建属性节点的方法设置了列表框中的项目,然后设定选择模式为2(0 or more),输出应该是一维数组可为什么我把鼠标放在输出端时及时帮助显示还是有符号32位
    发表于 11-09 17:33

    if不能判断有符号数的大小?编译器bug还是我bug了。。。

    ,所以不发生0xff。我怀疑是if不能判断正负,于是单独编写了一个函数测试,然后是判断正负的。所以,我目前的程序出了bug了吗?有符号数的0xfe13绝对是个负数吧,那是哪里搞错了呢?求大神赐教,解决完这个问题好回家过中秋啊
    发表于 09-14 10:23

    脉冲波形的产生整型

    脉冲波形的产生整型
    发表于 01-21 20:33

    是否可以获得两个符号数之差的符号结果?

    嗨,可能是个愚蠢的问题。我有两个像这样的符号变量(XC32):当在两个变量之间求差时,我得到一个有符号的结果(即,在某个点上可能有负值)。为了纠正这个问题,我得到了结果的绝对值。我的问题是:我
    发表于 03-24 07:50

    怎么通过FPGA向DSP发送有符号整型数据?

    我用的是TL138EVM-F的开发板,在用FPGA和DSP通信的时候遇到点问题。我看了创龙的例程有UPP的外部回环测试,上板也验证成功了。我现在需要做的是通过FPGA向DSP发送有符号整型数据,再
    发表于 04-01 10:27

    整型数据在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

    fpga 有符号数、符号

     在设计中,所有的算数运算符都是按照符号数进行的。如果要完成有符号数计算,对于加、减操作通过补码处理即可用符号加法完成。对于乘法操作,
    的头像 发表于 10-09 15:22 6062次阅读
    fpga 有<b class='flag-5'>符号</b>数、<b class='flag-5'>无</b><b class='flag-5'>符号</b>数

    C++编程中整型数据在内存中存储是怎么样的

    1.整型的归类 char short int long 以上都分为有符号(signed)与符号(unsigned)的类型 2.原码、反码和补码 2.1 定义 计算机在表示一个数字时,
    的头像 发表于 09-01 15:22 5632次阅读

    如何取整求个符号整数的平均值

    取整求个符号整数的平均值,居然也整出花儿来?
    的头像 发表于 03-18 10:24 2443次阅读

    常见的PLC系统BUG有哪些?如何减少这些BUG产生

    PLC系统可能会遇到各种不同类型的BUG,以下是一些常见的PLC系统BUG以及如何减少这些BUG产生的建议: (1)逻辑错误:逻辑错误是最常见的PLC系统
    的头像 发表于 10-31 11:30 1100次阅读
    常见的PLC系统<b class='flag-5'>BUG</b>有哪些?如何减少这些<b class='flag-5'>BUG</b>的<b class='flag-5'>产生</b>?

    常见的PLC系统BUG有哪些?如何减少BUG产生呢?

    PLC系统可能会遇到各种不同类型的BUG,以下是一些常见的PLC系统BUG以及如何减少这些BUG产生的建议
    的头像 发表于 10-31 11:29 873次阅读

    java中长整型怎么定义

    在Java中,长整型是一种数据类型,用于存储整数值。它的取值范围比整型要大,可以存储更大的整数值。长整型的大小为8字节,即64位。在Java中,长整型用关键字"long"进行声明和定义
    的头像 发表于 11-30 11:29 3310次阅读

    char是有符号类型还是符号类型?

    看一个C语言的笔试题,题目很简单,问char是有符号类型还是符号类型?
    的头像 发表于 03-17 10:15 1248次阅读