加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PIC中的整数溢出 – 流程在哪里?

发布时间:2020-12-16 06:45:49 所属栏目:百科 来源:网络整理
导读:使用Microchip 18f4620 PIC.但这应该是标准的ANSI C问题. 说我有 unsigned int16 badFlow=65535 //max unsigned int16 value 其二进制值为1111 1111 1111 1111. 如果我那么 badFlow++; 位模式变为1 0000 0000 0000 0000 17位.显然badFlow == 0,但是额外的翻
使用Microchip 18f4620 PIC.但这应该是标准的ANSI C问题.

说我有

unsigned int16 badFlow=65535 //max unsigned int16 value

其二进制值为1111 1111 1111 1111.

如果我那么

badFlow++;

位模式变为1 0000 0000 0000 0000
17位.显然badFlow == 0,但是额外的翻转位也是

>被丢弃
>或驻留在任何字节* flowPtr =& badFlow 2;
点.

我假设后者,但希望前者.

我的问题:一位同事用一个柜台写了一些不好的代码,这个柜台已经在所有生产的产品上溢出了大约2年.考虑到我们的客户对这些工具的使用收费,由于潜在的糟糕数据,这是几百万美元的危险.

解决方法

C中的算术使用值而不是内存中的字节进行.你的表达式badFlow等同于badFlow = badFlow 1.右侧被评估为int类型(由于默认促销,假设int大于16位;如果int只有16位,那么它将被评估为unsigned int)得到65536,然后当65536被分配到无符号的16位变量时,它以模数65536减少,结果为0.

摆脱这个问题的重要一点是badFlow不是对& badFlow的内存的直接操作(尽管它可能在某些实现中实现).它只是添加和赋值的简写.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读