背景
今天寫代碼,需要顯示數據發送次數,次數遞增,最大有可能有幾萬次。但是測試時發現數字到了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);