智能车制作
标题:
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
Temporary breakpoint 3, main () at test.c:4
4 unsigned char dat[5]={2,4,3,5,6};
(gdb) n
8 x=dat[0]*10000+dat[1]*1000+dat[2]*100+dat[3]*10+dat[4];
(gdb) n
9 d=x/1000;
(gdb) p x
$5 = 24356
(gdb) n
10 printf("%f\n",d);
(gdb) p x
$6 = 24356
(gdb) n
24.000000
12 d=dat[0]*10+dat[1]+dat[2]*0.1+dat[3]*0.01+dat[4]*0.001;
(gdb)
13 printf("%f\n",d);
(gdb)
24.356000
14 }
(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