打印

看了一上午程序,最后单步调试才找出这个BUG

[复制链接]
2274|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
batsong|  楼主 | 2010-11-26 13:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
u8 RAM[10]; u32 data;

              RAM[0]=3;
              RAM[1]=4;
              RAM[2]=5;
              RAM[3]=6;
              RAM[4]=7;
              RAM[5]=8;
              data  =   RAM[0]*100000;
              data  += RAM[1]*10000;
              data  += RAM[2]*1000;
              data  += RAM[3]*100;
              data  += RAM[4]*10;
              data  += RAM[5];
            
设想data最后等于 345678,但实际有时得不到正确结果,和RAM中的数字大小有关,下午下班发答案

相关帖子

沙发
Push_Pull| | 2010-11-26 14:37 | 只看该作者
本帖最后由 Push_Pull 于 2010-11-26 16:05 编辑

LZ把U8改成unsigned long 就可以了

使用特权

评论回复
板凳
zjswuyunbo| | 2010-11-26 14:59 | 只看该作者
呵呵,貌似类型需转换成32位处理

使用特权

评论回复
地板
mmax| | 2010-11-26 15:44 | 只看该作者
data  += RAM[1]*10000;

这句有问题吧
先计算 RAM[1]*10000;
是按16位计算的
然后按32位加的。

如果是7,8, 9 的话,结果就错了

使用特权

评论回复
5
mohanwei| | 2010-11-26 15:58 | 只看该作者
把“u8 RAM[10];”改成“u32 RAM[10];”如果还会有错你就可以去买彩票了

使用特权

评论回复
6
kl_ee| | 2010-11-26 16:03 | 只看该作者
类型转换有问题。插入一条:
data  =   RAM[0];再计算即可。

使用特权

评论回复
7
batsong|  楼主 | 2010-11-26 16:05 | 只看该作者
呵呵,编译器IAR

确实是data  += RAM[1]*10000;这句有问题
结果比楼上想的溢出更离谱,因为10000刚好可以用16位存储,RAM[1]*10000竟然被转换为signed short计算
4*10000 = 40000 = -25536
最后计算也被转换为有符号数data=300000-25536=274464

看来编译器计算时是优先把不明的数转换为有符号,有符号和无符号都参与计算时则按照有符号计算

使用特权

评论回复
8
coreduo| | 2010-11-26 20:13 | 只看该作者
知道8位机的 悲哀的了吧

使用特权

评论回复
9
zhiyonghe| | 2010-11-27 12:15 | 只看该作者
这个真的要小心

使用特权

评论回复
10
救火车| | 2010-11-27 13:37 | 只看该作者
本帖最后由 救火车 于 2010-11-27 13:38 编辑

弄个长整型中间变量就行了。
unsigned long tt;
tt= RAM[0]*100000;
data +=tt;
都这么写就行了。这个错误我也犯过好多次。:$

使用特权

评论回复
11
batsong|  楼主 | 2010-11-27 13:50 | 只看该作者
我是直接在每个数前面加(unsigned long)强制转换

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:本人精通模拟电路、数字电路、射频电路、电源电路的焊接; 精通cadence allegro、altium designer、power pcb、visual studio等软件的安装与卸载; 精通windows、Linux、Mac、Android、IOS等系统的开关机。

45

主题

1146

帖子

6

粉丝