背景
今天写代码,需要显示数据发送次数,次数递增,最大有可能有几万次。但是测试时发现数字到了255之后便从零开始显示。显然是数据越界了。
其实这个问题很好解决,主要是数据类型转换就可以。但是如果遇到一个8位机,而且设备提供的接口函数中,数据的类型只有8位整形,该怎么办?就像我今天遇到的。
解决
设备提供一个现实数据的接口函数:
void _putstr(U8 *p);
其输入只能是8位整型,也即大于255的数字无法正确显示出来,这就需要做一些数字的转换。
例,需要显示的数字为65535
,可以将其拆分为65
、53
、5
显示。如果1001
可以拆分为10
01
进行显示。
下面是代码实现:
void Show16data( U8 line,U8 n,U16 data )
{
char num_temp[1];
U8 dataH,dataM,dataL;
_gotoxy(n,line);
if (data >= 10000)
{
dataH =(U8)(data / 1000);
dataM = (U8)((data%1000)/10);
dataL = (U8)(data%10);
sprintf(num_temp,"%02d",dataH);
// 注意一定格式化字符串的时候两位数要用%02d来控制 如20011 才能正确显示20011,否则有可能显示2011
_putstr(num_temp);
sprintf(num_temp,"%02d",dataM);
_putstr(num_temp);
sprintf(num_temp,"%1d",dataL); //个位数需要用 %1d来控制
_putstr(num_temp);
}
else if (data >= 1000)
{
dataH =(U8)(data / 100);
dataL = (U8)(data%100);
sprintf(num_temp,"%02d",dataH);
_putstr(num_temp);
sprintf(num_temp,"%02d",dataL);
_putstr(num_temp);
}
else if (data >= 100)
{
dataH =(U8)(data / 10);
dataL = (U8)(data%10);
sprintf(num_temp,"%02d",dataH);
_putstr(num_temp);
sprintf(num_temp,"%1d",dataL);
_putstr(num_temp);
}
else
{
sprintf(num_temp,"%02d",data);
_putstr(num_temp);
}
}
另外需要注意的是,数字拆分后最好加上强制数据转换 。
dataH =(U8)(data / 100);