打印

请教:MPLAB C30编译器v3.22有问题。

[复制链接]
4399|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
odqqdo|  楼主 | 2010-7-15 07:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
编译如下代码

#include <p30f3011.h>             //dsPIC30F3011标准头文件
#include"math.h"
/*配置位*/
_FOSC(CSW_FSCM_OFF & XT_PLL4);  //4倍频晶振,Failsafe 时钟关闭

unsigned long Sum=0;  

unsigned long Sum2=0;  
unsigned int temp=0;

int main(void)
{

Sum2=0XFEEE;       
temp=0X3FF;       
Sum=temp*temp;       
Sum2=Sum+Sum2;
Sum=Sum/32;

        while (1)
        {
;

        }
}




编译后的汇编代码为:
30:                Sum=temp*temp;       
  019E  804041     mov.w 0x0808,0x0002
  01A0  804040     mov.w 0x0808,0x0000
  01A2  B98800     mul.ss 0x0002,0x0000,0x0000
  01A4  200001     mov.w #0x0,0x0002        ***问题在这本来 0x0002 为32位结果的高16位,它把它清零了 ,为什么?
  01A6  884000     mov.w 0x0000,0x0800
  01A8  884011     mov.w 0x0002,0x0802
31:                Sum2=Sum+Sum2;
沙发
headwolf_83| | 2010-7-15 08:47 | 只看该作者
1、没有问题。SUM是16位,根据C语言,计算结果超过16位,只保留低16位,可以去看看类型转换的章节。
2、下次觉得有问题,可以换当前最新的编译器版本看看,现在应该是3.23还是更高点了。

使用特权

评论回复
板凳
odqqdo|  楼主 | 2010-7-15 10:51 | 只看该作者
谢谢 headwolf_83
1、没有问题。SUM是16位,根据C语言,计算结果超过16位,只保留低16位

可是加法计算不会这样啊。有进位可以进位
下了新的版本3.23也是一样
怎么解决这个问题呢?

使用特权

评论回复
地板
headwolf_83| | 2010-7-15 14:42 | 只看该作者
加法计算,请你看看你是SUM2是多少位的,32位。当然没有问题。你用的是C语言,不是MATLAB语言(默认浮点),数字计算,边界问题,符号问题,自己都要注意下,还有疑问,可以先看看标准C有关类型转换的章节。

使用特权

评论回复
5
odqqdo|  楼主 | 2010-7-15 15:53 | 只看该作者
谢谢!
解决了,用混合编程,自己用汇编语言编了一个程序计算

使用特权

评论回复
6
642142533| | 2011-10-20 19:40 | 只看该作者
楼主
  能给个你C30编译器的链接吗

使用特权

评论回复
7
e掾木| | 2011-10-21 07:55 | 只看该作者
Sum=temp*temp;  
    下次修改ANSI C99,推荐你做首席执行官。

使用特权

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

本版积分规则

21

主题

62

帖子

0

粉丝