论坛风格切换切换到宽版
  • 3113阅读
  • 15回复

奇怪。用KEILC算2*23861竞然是错的。 [复制链接]

上一主题 下一主题
离线wycx
 
发帖
1497
只看楼主 倒序阅读 0楼 发表于: 2006-05-09
用户被禁言,该主题自动屏蔽!
离线BG6AGB
发帖
915
只看该作者 1楼 发表于: 2006-05-09
存放结果的变量是定义成什么的?
如果是long就是你的这样状态,你应该写
temp=2*23861.0

如果你定义的是int,就不用写成上面那样。
具体原因还没研究


下面是验证的程序



  1. #include <regx51.h>
  2. unsigned long ulong;
  3. long slong;
  4. unsigned int uint;
  5. int sint;
  6. void main(void)
  7. {
  8.      ulong=2*23861;
  9.      ulong=2.0*23861;
  10.      slong=2*23861;
  11.      slong=2.0*23861;
  12.      uint=2*861;
  13.      uint=2.0*861;
  14.      sint=2*861;
  15.      sint=2.0*861;
  16.      for(;;);
  17. }
离线bellstudio
发帖
2820
只看该作者 2楼 发表于: 2006-05-10
还是要注意隐性的类型转换问题

至于lz说的问题,不妨看看编译出来的代码
离线wycx
发帖
1497
只看该作者 3楼 发表于: 2006-05-10
用户被禁言,该主题自动屏蔽!
离线BG6AGB
发帖
915
只看该作者 4楼 发表于: 2006-05-10
'
我是定义结果是unsigned long型的。。
可是不明白为什么会有这样的情况。
temp=2*23861.0试过。还是不对。。。
我在程序中是用一个unsigned char乘23861的。。。结果就不对了。。
'


不会吧,我又试验了一下,如果先定义一个unsigned char
那么无论是乘23861.0 还是23861结果都是对的啊
你是不是改动keil的编译参数了?
或者你重装一次keil看看,把原来的完全删掉
离线BG7IGJ
发帖
1998
只看该作者 5楼 发表于: 2006-05-10
unsigned long 型数据是 4字节的,2*23861=ba6a(结果是16进制,这个结果是正确的)是双字节,所以,你付给unsigned long 数据时,就将 ba6a 付给了他的 低两字节,高两字节还是他原来的那个数ffff
unsigned char 是单字节的,所以 得出的结果也不可能是正确,因为2*23861=ba6a结果是双字节,单字节的内存是放不下的
只有将 数据类型定为 unsigned int (无符号双字节) 才能得到正确的结果
离线BG6AGB
发帖
915
只看该作者 6楼 发表于: 2006-05-10
'
unsigned long 型数据是 4字节的,2*23861=ba6a(结果是16进制,这个结果是正确的)是双字节,所以,你付给unsigned long 数据时,就将 ba6a 付给了他的 低两字节,高两字节还是他原来的那个数ffff
unsigned char 是单字节的,所以 得出的结果也不可能是正确,因为2*23861=ba6a结果是双字节,单字节的内存是放不下的
只有将 数据类型定为 unsigned int (无符号双字节) 才能得到正确的结果
'


看来我回的不够清楚

lz说:“我在程序中是用一个unsigned char乘23861的”
我就定义了一个unsigned char 来乘以23861和23861.0,结果分别赋给long,unsigned long,int,unsigned int四种类型的变量。
离线BG7IGJ
发帖
1998
只看该作者 7楼 发表于: 2006-05-10
'
看来我回的不够清楚
lz说:“我在程序中是用一个unsigned char乘23861的”
我就定义了一个unsigned char 来乘以23861和23861.0,结果分别赋给long,unsigned long,int,unsigned int四种类型的变量。
'

什么类型乘以23861得出的结果都是一样的,结果存入的内存数据的类型才会影响结果
离线wycx
发帖
1497
只看该作者 8楼 发表于: 2006-05-10
用户被禁言,该主题自动屏蔽!
离线bd4ji
发帖
4532
只看该作者 9楼 发表于: 2006-05-11
'
把23861换成了23861.0结果对了,可是代码长了好多。。。。。
'
23861.0就是float类型了,编译的时候会加入浮点运算库自然会造成代码长很多。
你可以试一下:
unsigned int result;
unsigned char a;
unsigned int b;

a = 2;
b = 22861;

result = (unsigned int)a * b;
离线wycx
发帖
1497
只看该作者 10楼 发表于: 2006-05-11
用户被禁言,该主题自动屏蔽!
离线yido
发帖
52
只看该作者 11楼 发表于: 2006-05-11
整数×2的n次方这样的运算最节省代码和效率最高的方法是移位。
离线BG6AGB
发帖
915
只看该作者 12楼 发表于: 2006-05-12
'
整数×2的n次方这样的运算最节省代码和效率最高的方法是移位。
'

lz不是固定的乘2,而是一个不固定的数乘23861
离线wycx
发帖
1497
只看该作者 13楼 发表于: 2006-05-12
用户被禁言,该主题自动屏蔽!
离线BG6AGB
发帖
915
只看该作者 14楼 发表于: 2006-05-12

'
[表情]
'
离线wycx
发帖
1497
只看该作者 15楼 发表于: 2006-05-12
用户被禁言,该主题自动屏蔽!