打印

发现c的值不对

[复制链接]
431|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guoyt|  楼主 | 2021-5-5 21:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前做了程序:

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的值却是正确的?请问为什么?

使用特权

评论回复
沙发
chuxh| | 2021-5-5 21:36 | 只看该作者

arm的int是32位的
51的int是16位的
更多操作

使用特权

评论回复
板凳
stly| | 2021-5-5 21:38 | 只看该作者
楼上大牛一针见血

使用特权

评论回复
地板
dingy| | 2021-5-5 21:41 | 只看该作者
尽量少用'int'数据类型,用'short'表示16位的数据,用'long'表示32位数据,这样代码在不同平台间移植就会更容易。

使用特权

评论回复
5
guoyt|  楼主 | 2021-5-5 21:43 | 只看该作者

iar  我使用 uint16_t   u16 替换unsigned int  
测试结果也是正常的  这个u16也是32位?

使用特权

评论回复
6
heweibig| | 2021-5-5 21:46 | 只看该作者

这个也是有可能的

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

2:
有些编译器会自动提升整型计算,就是防止这种隐形出错

使用特权

评论回复
7
chuxh| | 2021-5-5 21:55 | 只看该作者
c= (long)a*100/b;

使用特权

评论回复
8
guoyt|  楼主 | 2021-5-5 21:57 | 只看该作者
不明白,算了吧

使用特权

评论回复
9
supernan| | 2021-5-5 21:59 | 只看该作者
数据类型转换的问题,大转小好像要强制类型转换吧

使用特权

评论回复
10
llia| | 2021-5-5 22:04 | 只看该作者
int值溢出了,数值设置的超过了int最大范围。

使用特权

评论回复
11
guoyt|  楼主 | 2021-5-5 22:07 | 只看该作者
嗯,预料中的结果,多谢大家啦

使用特权

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

本版积分规则

1018

主题

9067

帖子

3

粉丝