切换到宽版
  • 3563阅读
  • 11回复

[C51]keil编译器对变量和常量运算处理测试 [复制链接]

上一主题 下一主题
离线秉烛良宵
 

发帖
509
M币
3251
专家
23
粉丝
49
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2013-11-10
在写代码时突然遇到位数比较大的立即数乘除keil是怎样处理的问题,因为担心会溢出。所以做了如下的测试。
首先发现keil处理立即数运算时是直接就在编译中算出来了。


编译时keil已把结果计算出来了(99*99=9801(10011001001001B))tmp变量高八位100110(0x26)放在地址为0x008内存,低八位1001001(0x49)放在地址为0x009内存中。
如果是更大立即数相乘除但结果宽度不会超过tmp将会怎样,例如:tmp=999*99/99;这时keil编译时是否还可以正确计算出来。测试结果如下图:


从反编译窗口明显看出事出错了。正确的应该是高八位为0x3,第八位应该为0xE7。看来keil在编译时计算立即数时只使用16位来处理,如果中间结果有溢出的最终计算结果就出错。
下面再来测试立即数与变量运算是否也有同样的结果。首先来试下立即数与普通变量运算。


从反汇编窗口看出这时不会直接计算出结果了,计算过程放在了单片机内完成。
以上结果应该都是已经预想得到的。下面测试下tmp=999*99/t; 其实我们可以想到在计算999*99时肯定会溢出但是我们现在把t声明为unsigned long int测试下结果。



结果很明显了。
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共4条打赏 ,M币+12 ,专家+1
离线elecfun

发帖
1330
M币
164
专家
12
粉丝
87
只看该作者 1楼 发表于: 2013-11-10
请登录后查看
本帖最近打赏记录:共1条打赏 ,专家+1
离线fang3

发帖
4445
M币
22967
专家
44
粉丝
213
只看该作者 2楼 发表于: 2013-11-10
请登录后查看
本帖最近打赏记录:共1条打赏 ,专家+1
离线秉烛良宵

发帖
509
M币
3251
专家
23
粉丝
49
只看该作者 3楼 发表于: 2013-11-10
回 fang3 的帖子
请登录后查看
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线秉烛良宵

发帖
509
M币
3251
专家
23
粉丝
49
只看该作者 4楼 发表于: 2013-11-10
请登录后查看
离线秉烛良宵

发帖
509
M币
3251
专家
23
粉丝
49
只看该作者 5楼 发表于: 2013-11-10
请登录后查看
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共1条打赏 ,M币+5
离线fang3

发帖
4445
M币
22967
专家
44
粉丝
213
只看该作者 6楼 发表于: 2013-11-10
回 秉烛良宵 的帖子
请登录后查看
离线秉烛良宵

发帖
509
M币
3251
专家
23
粉丝
49
只看该作者 7楼 发表于: 2013-11-11
回 fang3 的帖子
请登录后查看
离线fang3

发帖
4445
M币
22967
专家
44
粉丝
213
只看该作者 8楼 发表于: 2013-11-11
回 秉烛良宵 的帖子
请登录后查看
离线秉烛良宵

发帖
509
M币
3251
专家
23
粉丝
49
只看该作者 9楼 发表于: 2013-11-11
回 fang3 的帖子
请登录后查看
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个