找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3043|回復(fù): 23
收起左側(cè)

C語(yǔ)言16進(jìn)制按10進(jìn)制顯示的問題

  [復(fù)制鏈接]
ID:881381 發(fā)表于 2021-1-29 15:21 | 顯示全部樓層 |閱讀模式
void UART_Send_DT(unsigned int Num)
{
   unsigned char a,b,c;
   a=Num/100;
   b=(Num%100)/10;
   c=Num%10;
   a=a+0x30;
   b=b+0x30;
   c=c+0x30;
   UART_Send_Byte(a);
   UART_Send_Byte(b);
   UART_Send_Byte(c);
}
為什么這個(gè)程序,當(dāng)Num<7F時(shí)顯示正常,>7F就不對(duì)了?

回復(fù)

使用道具 舉報(bào)

ID:871393 發(fā)表于 2021-1-29 15:33 | 顯示全部樓層
我試了沒有問題
回復(fù)

使用道具 舉報(bào)

ID:871393 發(fā)表于 2021-1-29 15:35 | 顯示全部樓層
而且你這個(gè)和16進(jìn)制沒什么關(guān)系 就是正常的10進(jìn)制三位數(shù)轉(zhuǎn)字符

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:879809 發(fā)表于 2021-1-29 15:35 來自手機(jī) | 顯示全部樓層
問題顯然不在這里。外面char型給Num賦值做了符號(hào)位擴(kuò)展,變負(fù)數(shù)了。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:878901 發(fā)表于 2021-1-29 16:04 | 顯示全部樓層
你可以試下這個(gè)方法,比用除法節(jié)省處理時(shí)間。如果輸入大于1000還需要對(duì)>1000和>10000處理。
void UART_Send_DT(unsigned int Num)
{
   unsigned char tmp;
  
   tmp=0;
   while(Num>100)
  {
       Num-=100;
       tmp++;
  }
  UART_Send_Byte(tmp+0x30);
  tmp =0;
  while(Num>10)
  {
      Num-=10;
      tmp++;
  }
  UART_Send_Byte(tmp+0x30);
  UART_Send_Byte(Num+0x30);
}

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:879809 發(fā)表于 2021-1-29 16:14 來自手機(jī) | 顯示全部樓層
再說一遍,0x7f擴(kuò)展到16位int是0x007f,0x80是-256,擴(kuò)展到int是0xff80還是-256,但是unsigned int 0xff80是65408啊!樓主位代碼沒錯(cuò)誤,錯(cuò)誤發(fā)生在調(diào)用這段代碼的代碼。
回復(fù)

使用道具 舉報(bào)

ID:881381 發(fā)表于 2021-1-29 17:43 | 顯示全部樓層
發(fā)表于 2021-1-29 15:35
問題顯然不在這里。外面char型給Num賦值做了符號(hào)位擴(kuò)展,變負(fù)數(shù)了。

我程序Num賦值是00~FF
回復(fù)

使用道具 舉報(bào)

ID:881381 發(fā)表于 2021-1-29 17:44 | 顯示全部樓層
zhanghya 發(fā)表于 2021-1-29 16:04
你可以試下這個(gè)方法,比用除法節(jié)省處理時(shí)間。如果輸入大于1000還需要對(duì)>1000和>10000處理。
void UART_Sen ...

程序中Num的賦值范圍是00H~FFH,最大才255啊
回復(fù)

使用道具 舉報(bào)

ID:881381 發(fā)表于 2021-1-29 17:51 | 顯示全部樓層
本帖最后由 cyq1968 于 2021-1-29 18:04 編輯
zhanghya 發(fā)表于 2021-1-29 16:04
你可以試下這個(gè)方法,比用除法節(jié)省處理時(shí)間。如果輸入大于1000還需要對(duì)>1000和>10000處理。
void UART_Sen ...

問題是小于7F時(shí)是正常的,一到80H以上就不對(duì)了,會(huì)是什么問題?請(qǐng)問 當(dāng)Num賦值7F,a=31,b=32,c=37;當(dāng)賦值為80時(shí),a=de,b=30,c=38;大于80后,都不對(duì)了,問題出在什么地方了?
回復(fù)

使用道具 舉報(bào)

ID:879809 發(fā)表于 2021-1-29 18:00 來自手機(jī) | 顯示全部樓層
cyq1968 發(fā)表于 2021-1-29 17:51
問題是小于7F時(shí)是正常的,一到80H以上就不對(duì)了,會(huì)是什么問題?

原來你不懂符號(hào)位擴(kuò)展。0x80是-128,擴(kuò)展到16位int就是0xff80,還是-128,但是你當(dāng)成65408來處理了。你貼的代碼沒問題,是調(diào)用這段代碼的代碼錯(cuò)了。
回復(fù)

使用道具 舉報(bào)

ID:881381 發(fā)表于 2021-1-29 18:12 | 顯示全部樓層
發(fā)表于 2021-1-29 18:00
原來你不懂符號(hào)位擴(kuò)展。0x80是-128,擴(kuò)展到16位int就是0xff80,還是-128,但是你當(dāng)成65408來處理了。你貼 ...

                 UART_Send_Str("n0.val=");
                  UART_Send_DT(power_count);
                  UART_Send_END();
我調(diào)用程序是這個(gè),第一行發(fā)送字符串,第二行就是調(diào)用。
請(qǐng)問,符號(hào)位擴(kuò)展確實(shí)不懂,該怎么解決呢?謝謝是不是應(yīng)該定義成unsigned int變量來解決?
回復(fù)

使用道具 舉報(bào)

ID:881381 發(fā)表于 2021-1-29 18:22 | 顯示全部樓層
本帖最后由 cyq1968 于 2021-1-29 18:27 編輯
rundstedt 發(fā)表于 2021-1-29 18:00
原來你不懂符號(hào)位擴(kuò)展。0x80是-128,擴(kuò)展到16位int就是0xff80,還是-128,但是你當(dāng)成65408來處理了。你貼 ...

     unsigned int power_count=0;            //功率參考值
請(qǐng)問我變量為定義的是無(wú)符號(hào)整型,為什么會(huì)變成-128呢?調(diào)用程序如下:
                  UART_Send_Str("n0.val=");
                  UART_Send_DT(power_count);
                  UART_Send_END();


回復(fù)

使用道具 舉報(bào)

ID:332130 發(fā)表于 2021-1-29 21:39 | 顯示全部樓層
前面看上去沒有問題,可能是UART_Send_Byte函數(shù)的問題。
回復(fù)

使用道具 舉報(bào)

ID:332130 發(fā)表于 2021-1-29 21:41 | 顯示全部樓層
kaixuan_27 發(fā)表于 2021-1-29 21:39
前面看上去沒有問題,可能是UART_Send_Byte函數(shù)的問題。

改為這樣試試:UART_Send_Byte( (char)a );
回復(fù)

使用道具 舉報(bào)

ID:879809 發(fā)表于 2021-1-29 21:57 | 顯示全部樓層
a=Num/100;前面加一句Num&=0xff;
回復(fù)

使用道具 舉報(bào)

ID:275826 發(fā)表于 2021-1-30 21:52 | 顯示全部樓層
程序完全正確,沒有問題
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-1-31 10:27 | 顯示全部樓層
本帖最后由 wulin 于 2021-1-31 16:30 編輯

樓主這個(gè)函數(shù)看似沒有什么問題,Num>127出錯(cuò)的問題也不在此,但如果Num>999就肯定會(huì)出問題。試試如下寫法:
void UART_Send_DT(unsigned int Num)
{
        unsigned char a,b,c;
        a=Num/100%10+0x30;
        b=Num/10%10+0x30;
        c=Num%10+0x30;
        UART_Send_Byte(a);
        UART_Send_Byte(b);
        UART_Send_Byte(c);
}
回復(fù)

使用道具 舉報(bào)

ID:879809 發(fā)表于 2021-1-31 14:54 | 顯示全部樓層
無(wú)符號(hào)0x80是128,也就是說樓主超過128后出了問題,距離999還很遠(yuǎn)啊。
回復(fù)

使用道具 舉報(bào)

ID:822755 發(fā)表于 2021-1-31 21:09 | 顯示全部樓層
應(yīng)該是傳入的數(shù)據(jù)有問題。
回復(fù)

使用道具 舉報(bào)

ID:881381 發(fā)表于 2021-2-1 17:36 | 顯示全部樓層
KongQuan 發(fā)表于 2021-1-31 21:09
應(yīng)該是傳入的數(shù)據(jù)有問題。

傳入的數(shù)據(jù)定義是unsigned char,無(wú)符號(hào)字符,會(huì)不會(huì)和unsigned int無(wú)符號(hào)整型起沖突?
回復(fù)

使用道具 舉報(bào)

ID:881381 發(fā)表于 2021-2-1 17:44 | 顯示全部樓層
rundstedt 發(fā)表于 2021-1-29 15:35
問題顯然不在這里。外面char型給Num賦值做了符號(hào)位擴(kuò)展,變負(fù)數(shù)了。

請(qǐng)問外面定義的是unsigned char無(wú)符號(hào)字符,會(huì)不會(huì)影響?
回復(fù)

使用道具 舉報(bào)

ID:873001 發(fā)表于 2021-2-1 18:04 | 顯示全部樓層
void UART_Send_DT(unsigned char Num)
這樣試一下看行不
回復(fù)

使用道具 舉報(bào)

ID:881381 發(fā)表于 2021-2-1 18:35 | 顯示全部樓層
統(tǒng)一回復(fù):應(yīng)該還是3樓大大說的問題,數(shù)據(jù)經(jīng)過了多次傳遞,其中有一個(gè)變量被設(shè)置成char了,今天終于抓了出來,明天上機(jī)試一下,再給大家說結(jié)果,謝謝大家!
回復(fù)

使用道具 舉報(bào)

ID:881381 發(fā)表于 2021-2-2 10:15 | 顯示全部樓層
經(jīng)程序?qū)嶋H測(cè)試,問題解決,確實(shí)是參數(shù)類型問題,找到其中一個(gè)參數(shù)被設(shè)成了char,改成unsigned char后,問題解決。謝謝大家!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表