打印

单片机中数据类型转换的问题

[复制链接]
4414|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
lifeinjoy| | 2012-2-5 16:11 | 只看该作者
这个,其实是编译器的优化干的事,首先说你的程序,a变量只用了一次,所以编译器没给他分配内存,你如果查看汇编代码会发现,生产的代码为
MOV R3 #0x0a
MOV R2 #0x00
也就是说 变量a 对应的是内存为 工作寄存器R3 和 R2
而后面做乘法运算的时候,R3、R2被重新赋值了,所以从KEIL里面看,A的值变了;
如果用下面的程序:
void main()
{
    int a=10,d=0;
        float b=0.4, c;
        c=a*b;
        d=a;
        while(1);
}
看出区别了吗??
变量a后面又被使用了,所以编译器会给它分配“真正的”内存,对应的汇编代码为:
MOV 0X08 0X00
MOV 0X09 0X0A
所以,这个时候,你再查看的话,就会发现,a的值没变....


怎么样,20分能给我不。。。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
lxyppc + 1 我很赞同
板凳
lifeinjoy| | 2012-2-5 16:18 | 只看该作者
如果你把target option ->c51里面的code optimization 调为0,a的值也就不会变了.....不信,你试试...

使用特权

评论回复
地板
刘前辈| | 2012-2-5 19:23 | 只看该作者
3#
如果你把target option ->c51里面的code optimization 调为0,a的值也就不会变了.....不信,你试试...



我试过了,无论优化级别调为0,还是8,a的值照样变化为-13181。

不信,3楼你试试……

、、

使用特权

评论回复
5
lifeinjoy| | 2012-2-5 19:31 | 只看该作者
回帖没法加图片呀.....
不然就把截图给发过去了
我在KEIL4里试过了,完全可以。。。。

使用特权

评论回复
6
刘前辈| | 2012-2-6 12:50 | 只看该作者
呵呵,请用C51-7.06以下版本编译,Keil2运行。——它证明了这不属于优化问题。

Keil4是C51-9.0版本。

举个简单的例子:24/1.1=240/11;

整型a=24 除以浮点b=1.1,a 先要化为240(或者24.0),运算符两边分量要求一致才行。

这在C概念中叫做整提升?

因为无论用优化0还是优化9,最后代码量一样,丝毫没有因优化而减少,所以不是优化问题。



、、


、、

使用特权

评论回复
7
yewuyi| | 2012-2-6 13:45 | 只看该作者
C=a*b;后强制类型转换了

使用特权

评论回复
8
简单人c|  楼主 | 2012-2-6 18:56 | 只看该作者
谢谢各位的讲解

使用特权

评论回复
9
lifeinjoy| | 2012-2-6 22:32 | 只看该作者
楼主说一下,你用的KEIL版本是多少?

使用特权

评论回复
10
xiaolong2013| | 2014-6-9 22:09 | 只看该作者
学习了,谢谢分享

使用特权

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

本版积分规则

0

主题

16

帖子

0

粉丝