打印

c18出现这种错误,搞不懂是不是C18垃圾

[复制链接]
2464|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuntian|  楼主 | 2007-6-21 11:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
long x;
int y,z;

x=y*8000;

但X的高两个字节被清零了,搞不懂为什么?
程序自动调用的16BIT乘16BIT的程序库.
如果Y=200;
那么结果就该是180000;
但看一结果你就知道了,C18垃圾还是我不懂?
沙发
soso| | 2007-6-21 12:24 | 只看该作者

直觉也该知道是谁的问题

  改成:
   unsigned long x;
   unsigned int y,z;
   x = y * 8000;

   编译器默认long、int为signed的。
建议编程明确unsigned or signed.

使用特权

评论回复
板凳
judge| | 2007-6-21 13:36 | 只看该作者

楼上的说的对

使用特权

评论回复
地板
yuntian|  楼主 | 2007-6-21 13:54 | 只看该作者

试一下你就知道谁对了.

编译一下看

使用特权

评论回复
5
martin| | 2007-6-21 16:37 | 只看该作者

不要对C编译器要求太高

不奇怪,C18数学库提供的乘法有FXM3232,FXM1616U等,在你没有指定下,它就会傻傻地用FXM1616U去做INT的乘法。
把代码改成
x=(unsigned long)y*8000
C编译器就会知道要用32位的乘法了。你可以认为C18是个不足够智能化的C编译器,但不要认为它是个会犯浅显错误的垃圾编译器。

使用特权

评论回复
6
judge| | 2007-6-21 20:43 | 只看该作者

还真如楼主所说.是我在臆断了.

用C18只做过几个工装, 也没有正儿八经的做产品.  这倒是头痛的事.
现在的C编绎器水平来说, 那C18算是烂的.  不管怎么便宜, 这样的事情多了,就不好了.

使用特权

评论回复
7
yuntian|  楼主 | 2007-6-22 09:09 | 只看该作者

头大

to:martin
其实我也知道加一个LONG可以变成我想要的结果,
但在调用16BIT的乘法时,返回结果是32位的,但它就是不把这个结果给赋值.
PICC和C51都可以这样做的,PIC还是要加把劲

使用特权

评论回复
8
YLKS| | 2007-6-25 14:31 | 只看该作者

正常,HT PICC18这种情况,最好做强制类型变换。

    unsigned long x;
    unsigned int y,z;
    
    y=7000;
    x=(ulong)(y)*8000;

使用特权

评论回复
9
ddb_21ic| | 2007-6-26 03:31 | 只看该作者

实际上这是程序员的事情

单片机不是PC,没有那么多资源,很多时候高级语言会根据硬件情况做一些功能调整,不然编译结果就会不适合在单片机上运行(看看VC编译后EXE的体积就知道了)。
不要经常把垃圾挂在嘴边,不然自己就是个垃圾桶了。
如果你认为PICC18做得不好,你可以自己做一个,还可以参照gcc的实现。Microchip的C18编译器是基于gcc的,有源码可以下载,部分GPL。
如果有一天,一个java程序员来编单片机软件,一定会发现语言有更多不够智能化的地方,但不是说明他水平高,而是不会从单片机的角度来思考,这个平台究竟需要什么样的编译器。

使用特权

评论回复
10
tjsheep| | 2007-6-26 07:29 | 只看该作者

嗯,其实这些问题一般在optimized c compiler manual

中会有说明,嵌入式的c编译器都会有所精简,比如一般的c编译器默认对全局变量或静态变量中没有赋值的数赋为0,但是ti的编译器就不管了,导致一样的程序弄到ti的dsp中就不太正常了,但是不是错误,因为ansi c没有强制规定要清0,呵呵,所以还要多读manual的……

使用特权

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

本版积分规则

29

主题

178

帖子

1

粉丝