[51单片机] 问个数据溢出的问题

[复制链接]
1063|6
 楼主| 清风致影 发表于 2015-1-8 11:17 | 显示全部楼层 |阅读模式
之前做了程序:

main()
{
        unsigned int a =2000;
        unsigned int b =3000;
        unsigned int c =0;
        c= a*100/b;
        while(1);
}
1、在51 keil下面测试  发现c的值不对 不是预想中的c=66结果,感觉是a*100已经大于整型的范围造成错误

2、但在stm32 iar下测试 发现c的值却是正确的?请问为什么?

ayb_ice 发表于 2015-1-8 11:23 | 显示全部楼层
arm的int是32位的
51的int是16位的
as564335sa 发表于 2015-1-8 12:05 | 显示全部楼层
楼上大牛一针见血
shuwei_yz 发表于 2015-1-8 13:30 | 显示全部楼层
尽量少用'int'数据类型,用'short'表示16位的数据,用'long'表示32位数据,这样代码在不同平台间移植就会更容易。
 楼主| 清风致影 发表于 2015-1-9 09:22 | 显示全部楼层
ayb_ice 发表于 2015-1-8 11:23
arm的int是32位的
51的int是16位的

iar  我使用 uint16_t   u16 替换unsigned int  
测试结果也是正常的  这个u16也是32位?
ayb_ice 发表于 2015-1-9 10:46 | 显示全部楼层
清风致影 发表于 2015-1-9 09:22
iar  我使用 uint16_t   u16 替换unsigned int  
测试结果也是正常的  这个u16也是32位? ...

这个也是有可能的

1:
后面的100默认就是int整型,所以会正确,这样写可能还是会出错
c= a * ((U16)100) / b;

2:
有些编译器会自动提升整型计算,就是防止这种隐形出错
yhn1973 发表于 2015-1-9 16:32 | 显示全部楼层
c= (long)a*100/b;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我在背后默默的看着你 默默的看着你渐去渐远渐无影

165

主题

1168

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部