智能车制作

标题: 51单片机的奇葩问题 [打印本页]

作者: leifukes    时间: 2014-4-26 19:57
标题: 51单片机的奇葩问题

unsigned char dat[5]={ 2,4,3,5,6};
int x;
double d;

(第一种)
x = dat[0]*10000+dat[1]*1000+dat[2]*100+dat[3]*10+dat[4];
d = x/1000;
得到 d=24.300 (省略了小数后两位)

(第二种)

d = dat[0]*10+dat[1]+dat[2]*0.1+dat[3]*0.01+dat[4]*0.001;
得到 d=24.356 (正确)

不知道是怎么回事??



作者: 村上葱树    时间: 2014-4-26 20:04
d跟x要同一种数据类型
作者: 狂野的庄稼汉    时间: 2014-4-26 21:15
  1. Temporary breakpoint 3, main () at test.c:4
  2. 4           unsigned char dat[5]={2,4,3,5,6};
  3. (gdb) n
  4. 8           x=dat[0]*10000+dat[1]*1000+dat[2]*100+dat[3]*10+dat[4];
  5. (gdb) n
  6. 9           d=x/1000;
  7. (gdb) p x
  8. $5 = 24356
  9. (gdb) n
  10. 10          printf("%f\n",d);
  11. (gdb) p x
  12. $6 = 24356
  13. (gdb) n
  14. 24.000000
  15. 12          d=dat[0]*10+dat[1]+dat[2]*0.1+dat[3]*0.01+dat[4]*0.001;
  16. (gdb)
  17. 13          printf("%f\n",d);
  18. (gdb)
  19. 24.356000
  20. 14      }
  21. (gdb)
复制代码
可以看到d=x/1000;这一步之后,d的值实际是24,这句话是这样执行的,先x/1000得到的是24,因为x为int型,然后将所得值赋值给d,而d是double型,要进行类型转换,就得到了24.0这样的结果

PS:如果有错望指正
作者: 狂野的庄稼汉    时间: 2014-4-26 21:16
狂野的庄稼汉 发表于 2014-4-26 21:15
可以看到d=x/1000;这一步之后,d的值实际是24,这句话是这样执行的,先x/1000得到的是24,因为x为int型,然 ...

写错了,d=x/1000;d的实际值为24.0
作者: [Dan]    时间: 2014-4-27 19:40
确实挺奇葩的,就算不同数据类型,也应该得到24.0吧,怎么会是24.300呢?
作者: leifukes    时间: 2014-4-27 19:43
非常感谢,懂了




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2