打印

是我的KEIL出问题了还是自己水平太差?

[复制链接]
2049|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
atuz|  楼主 | 2008-10-26 01:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用的是C517.0.
j 是个长整数,运行结果: 第一个结果错误,j只有整数部分了,其余三个正确,好奇怪呀。


while(1){
  j = 20000*4;
  j = 20000L*4;
  j = 65535*4;
  j = 65535L*4;
  }

相关帖子

沙发
xuehongren| | 2008-10-26 08:11 | 只看该作者

是你的错啰

看看 《我的错误 与大家分享》 (273字节) 
呵呵 你就明白了

使用特权

评论回复
板凳
computer00| | 2008-10-26 08:19 | 只看该作者

溢出了。

使用特权

评论回复
地板
atuz|  楼主 | 2008-10-26 10:18 | 只看该作者

可能我爱纠缠一些无聊的问题

回一楼,我是看了你的帖子才写的。溢出我当然知道,我只是想请这里的高手给俺解释一下:

1、如果 20000*4 溢出 为什么 65535*4 不溢出 ?
2、为什么乘法溢出而加法不溢出?

可惜俺找了很久也没找到KEIL C51对隐式类型转换的说明,所以我只能认为这是个BUG

使用特权

评论回复
5
xuehongren| | 2008-10-26 10:26 | 只看该作者

回楼主

65535*4怎么会不溢出呢 
该溢出的都会溢出的,只是你的用法可能避免了它的溢出.

使用特权

评论回复
6
atuz|  楼主 | 2008-10-26 10:41 | 只看该作者

.....

溢出不溢出你试试就知道了,如果都溢出,我也就不奇怪了。而且我手上单片机C语言书都是说对于运算是隐式转换的。难道他们都是误人子弟???

使用特权

评论回复
7
zyok| | 2008-10-26 10:44 | 只看该作者

确实是溢出,我也不知道为什么,帮顶!

正如4楼所说:

1、如果 20000*4 溢出 为什么 65535*4 不溢出 ?
2、为什么乘法溢出而加法不溢出?

使用特权

评论回复
8
xuehongren| | 2008-10-26 13:32 | 只看该作者

不好意思

KEIL对如下的语句是直接赋值的.
  j = 20000*4;
  j = 20000L*4;
  j = 65535*4;
  j = 65535L*4;
但我试了很久,没找到什么规律,望高手出现.

使用特权

评论回复
9
doob| | 2008-10-27 10:03 | 只看该作者

为什么会这样?算不算 keil 的bug?

使用特权

评论回复
10
computer00| | 2008-10-27 10:26 | 只看该作者

你用的是keil C51的编译器吧?

因为C51的编译器默然的整型为16位,所以对于小于32768的数就会认为是整型,做16位的运算,
对于运算结果超出16位的,就被截断了。如果运算结果最高位为1的,还要进行符号扩展,例如
如果你写的是j=20000*2;,结果就是0xFFFF9C40了。对于大于等于32768的数,就会先自动扩展为
long int型,然后再运算,这时结果就不会出错了,就像你程序中后三个结果一样。
为了安全起见,不管它多大,还是明确指定为好:
  j = 20000L*4;
  j = 20000L*4;
  j = 65535L*4;
  j = 65535L*4;
如果你换成keil CARM,就不会存在这个问题了,因为ARM是32位的,int就是32位的。

使用特权

评论回复
11
刘前辈| | 2009-4-14 17:00 | 只看该作者

我的keil C51没问题呀。

    11: while(1){ 
    12:   j = 20000*4; 
C:0x0009    750A38   MOV      0x0A,#0x38
C:0x000C    750B80   MOV      0x0B,#P0(0x80)
    13:   j = 20000L*4; 
C:0x000F    750A38   MOV      0x0A,#0x38
C:0x0012    750B80   MOV      0x0B,#P0(0x80)
    14:   j = 65535*4; 
C:0x0015    750AFF   MOV      0x0A,#0xFF
C:0x0018    750BFC   MOV      0x0B,#0xFC
    15:   j = 65535L*4; 
C:0x001B    750AFF   MOV      0x0A,#0xFF
C:0x001E    750BFC   MOV      0x0B,#0xFC
    16:   } 
C:0x0021    80E6     SJMP     C:0009
    17: } 
C:0x0023    22       RET      
C:0x0024    787F     MOV      R0,#0x7F

使用特权

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

本版积分规则

3

主题

73

帖子

0

粉丝