久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3289|回復: 23
收起左側

C語言16進制按10進制顯示的問題

  [復制鏈接]
ID:881381 發表于 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);
}
為什么這個程序,當Num<7F時顯示正常,>7F就不對了?

回復

使用道具 舉報

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

使用道具 舉報

ID:871393 發表于 2021-1-29 15:35 | 顯示全部樓層
而且你這個和16進制沒什么關系 就是正常的10進制三位數轉字符

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:879809 發表于 2021-1-29 15:35 來自觸屏版 | 顯示全部樓層
問題顯然不在這里。外面char型給Num賦值做了符號位擴展,變負數了。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:878901 發表于 2021-1-29 16:04 | 顯示全部樓層
你可以試下這個方法,比用除法節省處理時間。如果輸入大于1000還需要對>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);
}

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:879809 發表于 2021-1-29 16:14 來自觸屏版 | 顯示全部樓層
再說一遍,0x7f擴展到16位int是0x007f,0x80是-256,擴展到int是0xff80還是-256,但是unsigned int 0xff80是65408啊!樓主位代碼沒錯誤,錯誤發生在調用這段代碼的代碼。
回復

使用道具 舉報

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

我程序Num賦值是00~FF
回復

使用道具 舉報

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

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

使用道具 舉報

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

問題是小于7F時是正常的,一到80H以上就不對了,會是什么問題?請問 當Num賦值7F,a=31,b=32,c=37;當賦值為80時,a=de,b=30,c=38;大于80后,都不對了,問題出在什么地方了?
回復

使用道具 舉報

ID:879809 發表于 2021-1-29 18:00 來自觸屏版 | 顯示全部樓層
cyq1968 發表于 2021-1-29 17:51
問題是小于7F時是正常的,一到80H以上就不對了,會是什么問題?

原來你不懂符號位擴展。0x80是-128,擴展到16位int就是0xff80,還是-128,但是你當成65408來處理了。你貼的代碼沒問題,是調用這段代碼的代碼錯了。
回復

使用道具 舉報

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

                 UART_Send_Str("n0.val=");
                  UART_Send_DT(power_count);
                  UART_Send_END();
我調用程序是這個,第一行發送字符串,第二行就是調用。
請問,符號位擴展確實不懂,該怎么解決呢?謝謝是不是應該定義成unsigned int變量來解決?
回復

使用道具 舉報

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

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


回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

樓主這個函數看似沒有什么問題,Num>127出錯的問題也不在此,但如果Num>999就肯定會出問題。試試如下寫法:
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);
}
回復

使用道具 舉報

ID:879809 發表于 2021-1-31 14:54 | 顯示全部樓層
無符號0x80是128,也就是說樓主超過128后出了問題,距離999還很遠啊。
回復

使用道具 舉報

ID:822755 發表于 2021-1-31 21:09 | 顯示全部樓層
應該是傳入的數據有問題。
回復

使用道具 舉報

ID:881381 發表于 2021-2-1 17:36 | 顯示全部樓層
KongQuan 發表于 2021-1-31 21:09
應該是傳入的數據有問題。

傳入的數據定義是unsigned char,無符號字符,會不會和unsigned int無符號整型起沖突?
回復

使用道具 舉報

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

請問外面定義的是unsigned char無符號字符,會不會影響?
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:881381 發表于 2021-2-2 10:15 | 顯示全部樓層
經程序實際測試,問題解決,確實是參數類型問題,找到其中一個參數被設成了char,改成unsigned char后,問題解決。謝謝大家!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区三区乱码图片 | 色综合99| 中文福利视频 | 精品亚洲一区二区三区 | 精品国产精品国产偷麻豆 | 亚洲国产精品一区二区三区 | 91精品成人久久 | 国产成在线观看免费视频 | 日韩手机在线视频 | 欧美成人精品在线 | 中文字幕综合 | 成人在线中文字幕 | 久久久www成人免费无遮挡大片 | 国产精品国产三级国产aⅴ中文 | 久久精品中文字幕 | 欧美中文 | 美国av毛片| 欧美视频二区 | 中文字幕三区 | 亚洲一区在线播放 | 91精品观看 | 99伊人| 成人免费视频久久 | 在线永久看片免费的视频 | 久久久免费电影 | 日韩高清一区 | 在线观看中文字幕dvd播放 | 九一视频在线观看 | 日日操操操 | 成人精品在线观看 | 99精品国产一区二区青青牛奶 | 午夜影视大全 | 欧美日韩不卡在线 | 久久久久国产一区二区三区四区 | 91精品国产91久久久久青草 | 欧美精品一区二区在线观看 | 亚洲狠狠| 亚洲国产在| 视频在线一区二区 | 精品久久久久久久久久久久久 | 爱草在线 |