欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: C語言16進制按10進制顯示的問題 [打印本頁]

作者: cyq1968    時間: 2021-1-29 15:21
標題: C語言16進制按10進制顯示的問題
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就不對了?


作者: 77599585    時間: 2021-1-29 15:33
我試了沒有問題
作者: 77599585    時間: 2021-1-29 15:35
而且你這個和16進制沒什么關系 就是正常的10進制三位數轉字符
作者: rundstedt    時間: 2021-1-29 15:35
問題顯然不在這里。外面char型給Num賦值做了符號位擴展,變負數了。
作者: zhanghya    時間: 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);
}
作者: rundstedt    時間: 2021-1-29 16:14
再說一遍,0x7f擴展到16位int是0x007f,0x80是-256,擴展到int是0xff80還是-256,但是unsigned int 0xff80是65408啊!樓主位代碼沒錯誤,錯誤發生在調用這段代碼的代碼。
作者: cyq1968    時間: 2021-1-29 17:43
發表于 2021-1-29 15:35
問題顯然不在這里。外面char型給Num賦值做了符號位擴展,變負數了。

我程序Num賦值是00~FF

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

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

作者: cyq1968    時間: 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后,都不對了,問題出在什么地方了?

作者: rundstedt    時間: 2021-1-29 18:00
cyq1968 發表于 2021-1-29 17:51
問題是小于7F時是正常的,一到80H以上就不對了,會是什么問題?

原來你不懂符號位擴展。0x80是-128,擴展到16位int就是0xff80,還是-128,但是你當成65408來處理了。你貼的代碼沒問題,是調用這段代碼的代碼錯了。
作者: cyq1968    時間: 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變量來解決?

作者: cyq1968    時間: 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();



作者: kaixuan_27    時間: 2021-1-29 21:39
前面看上去沒有問題,可能是UART_Send_Byte函數的問題。
作者: kaixuan_27    時間: 2021-1-29 21:41
kaixuan_27 發表于 2021-1-29 21:39
前面看上去沒有問題,可能是UART_Send_Byte函數的問題。

改為這樣試試:UART_Send_Byte( (char)a );
作者: rundstedt    時間: 2021-1-29 21:57
a=Num/100;前面加一句Num&=0xff;
作者: tyrl800    時間: 2021-1-30 21:52
程序完全正確,沒有問題
作者: wulin    時間: 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);
}
作者: rundstedt    時間: 2021-1-31 14:54
無符號0x80是128,也就是說樓主超過128后出了問題,距離999還很遠啊。
作者: KongQuan    時間: 2021-1-31 21:09
應該是傳入的數據有問題。
作者: cyq1968    時間: 2021-2-1 17:36
KongQuan 發表于 2021-1-31 21:09
應該是傳入的數據有問題。

傳入的數據定義是unsigned char,無符號字符,會不會和unsigned int無符號整型起沖突?
作者: cyq1968    時間: 2021-2-1 17:44
rundstedt 發表于 2021-1-29 15:35
問題顯然不在這里。外面char型給Num賦值做了符號位擴展,變負數了。

請問外面定義的是unsigned char無符號字符,會不會影響?
作者: 1049489831    時間: 2021-2-1 18:04
void UART_Send_DT(unsigned char Num)
這樣試一下看行不
作者: cyq1968    時間: 2021-2-1 18:35
統一回復:應該還是3樓大大說的問題,數據經過了多次傳遞,其中有一個變量被設置成char了,今天終于抓了出來,明天上機試一下,再給大家說結果,謝謝大家!
作者: cyq1968    時間: 2021-2-2 10:15
經程序實際測試,問題解決,確實是參數類型問題,找到其中一個參數被設成了char,改成unsigned char后,問題解決。謝謝大家!




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1