打印

数据类型转换问题

[复制链接]
2281|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gutian120|  楼主 | 2012-5-22 11:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
变量定义:
float a1,a2,a3;
unsigned char b1,b2,b3;

a1 = 1.05;
a2 = 105.0;

a3 = a1 * 100.0;

b1 = a2;
b2 = a3;

仿真结果:a3值为 105.0000;b1 值为105;b2值为 104。请问为什么b1和b2的值不等?(编译器用的mplab IDE V8.63 C编译器为c30 v3.25)请各位大师指点下。
沙发
兰天白云| | 2012-5-22 13:25 | 只看该作者
105.0*100.0=105.0000?

使用特权

评论回复
板凳
gutian120|  楼主 | 2012-5-22 13:58 | 只看该作者
2# 兰天白云
这个当然不是,我发这个贴子,主要是不明白,为什么同样是float型数据,直接赋值105.0后再赋值给unsigned char 型数据,数据不会出错,但是如果中间加一个运算,比如 我发帖子中得 a3 = a1 *100.0  的到a3 = 105.0000(其中a1的值为1.05);再赋给一个unsigned char 型的数据,其值就会变为104,而非预期的105.

使用特权

评论回复
地板
兰天白云| | 2012-5-22 16:36 | 只看该作者
b1 = (unsigned char )a2;
b2 = (unsigned char )a3;

应该这么干

至于为什么会有105和104,看看编译手册

使用特权

评论回复
5
gutian120|  楼主 | 2012-5-22 16:44 | 只看该作者
4# 兰天白云
谢谢您的指点,前面加强制类型转换我也试过,就是不知道为什么值不一样,我看看编译手册

使用特权

评论回复
6
兰天白云| | 2012-5-22 17:11 | 只看该作者
a3 = a1 * 100.0的16进制结果a2的16进制数是不同的,实际a3=104.9999999999

强制转换后差1,如果要正确,必须自己编个小程序,对float转整型进行四舍五入

使用特权

评论回复
7
gutian120|  楼主 | 2012-5-22 17:21 | 只看该作者
6# 兰天白云
这样啊,谢谢您,我是仿真时用编译器的watch窗口看的值显示的是float型105.0000,而没有去看二进制……再次感谢您!

使用特权

评论回复
8
兰天白云| | 2012-5-23 08:20 | 只看该作者
这个结果在STM仿真界面也可看到,但是不能看16进制,在MPLAB界面可看到16进制,所以更容易发现问题

使用特权

评论回复
9
gutian120|  楼主 | 2012-5-23 17:13 | 只看该作者
8# 兰天白云
谢谢您的指点,我刚用编译器试了一下,原来在观察窗口属性里面的Formar  IEEE float 后面有个选项:scientific,选择这个的话,显示的是科学计数,就很容易发现。再次感谢您!

使用特权

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

本版积分规则

9

主题

26

帖子

0

粉丝