0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

单片机

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 (正确)

不知道是怎么回事??

提问者:chenliang513 地点:- 浏览次数:8149 提问时间:10-22 17:34
我有更好的答案
提 交
4条回答
LDF7803 08-29 15:24
这个应该是跟编译器生成的乘除法代码有关,而跟单片机无关吧
kaishengdianzi 08-24 00:37


这个跟运算时的数制转换有关,第二个因为后面你用的是0.1  0.01等数,是浮点型数据,因此计算时全部转换为浮点型计算,不会丢掉位数。第一个都是整型,计算时是用整型数据计算的,特别是第二步 x/1000这个算式,数据就是在这里丢掉的。可以改成 x/1000.0 试试看,应该就不会丢了。或者你的 x 也定义成double型。
mvueurtwd 08-31 03:10
你的x是int类型,他是整数类型定义,不可能有小数位的。你改成double或者float就OK了,int只分配2个字节都存储整型,double他会另分配两个字节存储为小数位。你可以自己看看单片机的数据类型相关的。
后天天后 08-26 10:14
你的dat[5]定义成unsigned char,还dat[0]*10000,不出错才怪。
撰写答案
提 交
1 / 3
1 / 3
相关单片机
具有音调控制的单片机立体声前置放大器
用于单片机与电子装置中的开关电源
单片机软硬件复位的条件都有啥
电动机的单片机控制
单片机应用系统开发实例导航