标题: 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://www.51hei.com/bbs/) Powered by Discuz! X3.1