8位機如何顯示超過255的16位的數字?

背景

今天寫代碼,需要顯示數據發送次數,次數遞增,最大有可能有幾萬次。但是測試時發現數字到了255之後便從零開始顯示。顯然是數據越界了。
其實這個問題很好解決,主要是數據類型轉換就可以。但是如果遇到一個8位機,而且設備提供的接口函數中,數據的類型只有8位整形,該怎麼辦?就像我今天遇到的。

解決

設備提供一個現實數據的接口函數:
void _putstr(U8 *p);
其輸入只能是8位整型,也即大於255的數字無法正確顯示出來,這就需要做一些數字的轉換。
例,需要顯示的數字爲65535,可以將其拆分爲65535顯示。如果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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章