OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4452|回复: 14

51单片机使用KEIL C51 数据碰到编译异常

[复制链接]

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
发表于 2016-6-22 15:05:58 | 显示全部楼层 |阅读模式
5金钱
KEIL C51 数据编译异常,大家伙碰到过没,KEIL的乘法问题,翻译出来有错啊,虽说可以我自己直接算了,但是这个问题到底是怎么产生的呢?如果是软件问题,我不认为这是个单纯软件问题能解释的,是我哪里设置错误了吗?


如果用加法就是完全没问题的
就是本来9600*4=38400的,换成16进制就是0x9600,按说他放进去的数那两个就是0x31跟0x32是不能塞入0xFF的,只能加0

最佳答案

查看完整内容[请看2#楼]

void main(void) { unsigned long aaa; aaa = 9600l*4; aaa +=0xa000; while(1); } 在9600后面加上L,指定常量是long类型计算
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2016-6-22 15:05:59 | 显示全部楼层
void main(void)
{
    unsigned long aaa;
    aaa = 9600l*4;
    aaa +=0xa000;
    while(1);
}
在9600后面加上L,指定常量是long类型计算
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2016-6-22 15:07:02 | 显示全部楼层
但是只有
AAA=9600;
AAA=AAA+9600;
AAA=AAA+9600;
AAA=AAA+9600;
这样的加法才是对的,如果是AAA=9600+9600+9600+9600那结果一样
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-6-22 20:30:02 | 显示全部楼层
表示没看明白。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

168

帖子

0

精华

高级会员

Rank: 4

积分
780
金钱
780
注册时间
2016-5-28
在线时间
64 小时
发表于 2016-6-22 23:34:26 | 显示全部楼层
真没有看明白。错误的结果是多少?是不是用的有符号数呢?16位有符号数最大32767
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2016-6-23 08:38:34 | 显示全部楼层
正点原子 发表于 2016-6-22 20:30
表示没看明白。。。

这么说吧,都是无符号数,32位的,
然后我让
AAA=9600*4,因为编译器优化,他会自己帮我把9600*4算出来是38400,换成十六进制就是0x9600
那他存入32位的数据池(地址0x31,32,33,34),应该是34存00,33存96,32跟31都是存00的,结果他32,31塞进去两个FF
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2016-6-23 08:40:09 | 显示全部楼层
正点原子 发表于 2016-6-22 20:30
表示没看明白。。。

而且,更恶心的是,我让AAA=9600*3就是对的,*4就出幺蛾子
即使我把写法改成9600+9600+9600+9600也是一样,除非是采用AAA=AAA+9600;这种写法
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2016-6-23 08:41:38 | 显示全部楼层
mcudiy 发表于 2016-6-22 23:34
真没有看明白。错误的结果是多少?是不是用的有符号数呢?16位有符号数最大32767

数据类型是unsigned long呢,按说不应该溢出还是咋滴啊
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2016-6-23 08:42:59 | 显示全部楼层
就是说我的编译器把9600*4这个结果算成了0xFFFF9600
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2016-6-23 09:33:58 | 显示全部楼层
DongInker 发表于 2016-6-22 15:05
void main(void)
{
    unsigned long aaa;

你是对的~
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2016-6-23 09:34:09 | 显示全部楼层
DongInker 发表于 2016-6-22 15:05
void main(void)
{
    unsigned long aaa;

谢谢
回复

使用道具 举报

5

主题

168

帖子

0

精华

高级会员

Rank: 4

积分
780
金钱
780
注册时间
2016-5-28
在线时间
64 小时
发表于 2016-6-23 20:27:32 | 显示全部楼层
意思搞明白了,我测试了一下,
unsigned long mmm;
mmm=9600*4;
这样在watch窗口中查看是不对的。
        mmm=9600;
        mmm*=4;
或者
        mmm=((long)9600)*4;
结果是正确的。
估计是编译器缺省表示数值范围的原因,其实在51单片机上面进行32位操作效率非常低。
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2016-6-24 15:07:28 | 显示全部楼层
mcudiy 发表于 2016-6-23 20:27
意思搞明白了,我测试了一下,
unsigned long mmm;
mmm=9600*4;

恩,是的,我被阴的体无完肤啊,我主要是要做一个很小的板子,1.8cm*1.8cm,要放单片机还有另外一个容压芯片CAV444,实在没空间,只能选择51了
回复

使用道具 举报

5

主题

168

帖子

0

精华

高级会员

Rank: 4

积分
780
金钱
780
注册时间
2016-5-28
在线时间
64 小时
发表于 2016-6-26 10:38:25 | 显示全部楼层
用C51编程不要偷懒,一般程序也不会太长,最好在源代码语句中能够增加“辅助”编译器的代码,比如运算优先级用括号明确告诉编译器,有些长的运算式子分步书写,防止被编译器黑了。现在STM32也有体积比较小的芯片,比如STM32F103有48脚封装的,很小,价格也与51基本相当(STM单片机 STM32F103C8T6 LQFP48 网上有5块左右的)
回复

使用道具 举报

2

主题

171

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3792
金钱
3792
注册时间
2016-6-26
在线时间
276 小时
发表于 2016-6-26 13:24:18 | 显示全部楼层
顶一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 16:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表