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

[复制链接]
2967|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
xuehongren 发表于 2008-10-26 10:26 | 显示全部楼层

回楼主

65535*4怎么会不溢出呢 
该溢出的都会溢出的,只是你的用法可能避免了它的溢出.
 楼主| atuz 发表于 2008-10-26 10:41 | 显示全部楼层

.....

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

zyok 发表于 2008-10-26 10:44 | 显示全部楼层

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

正如4楼所说:

1、如果 20000*4 溢出 为什么 65535*4 不溢出 ?
2、为什么乘法溢出而加法不溢出?
xuehongren 发表于 2008-10-26 13:32 | 显示全部楼层

不好意思

KEIL对如下的语句是直接赋值的.
  j = 20000*4;
  j = 20000L*4;
  j = 65535*4;
  j = 65535L*4;
但我试了很久,没找到什么规律,望高手出现.
doob 发表于 2008-10-27 10:03 | 显示全部楼层

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

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位的。
刘前辈 发表于 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

粉丝
快速回复 在线客服 返回列表 返回顶部