找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1958|回复: 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 来自手机 | 显示全部楼层
本帖最后由 rundstedt 于 2021-1-29 16:22 编辑

再说一遍,0x7f扩展到16位int是0x007f,0x80是-256,扩展到int是0xff80还是-256,但是unsigned int 0xff80是65408啊!楼主位代码没错误,错误发生在调用这段代码的代码。
回复

使用道具 举报

ID:881381 发表于 2021-1-29 17:43 | 显示全部楼层
rundstedt 发表于 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 | 显示全部楼层
本帖最后由 cyq1968 于 2021-1-29 18:15 编辑
rundstedt 发表于 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 单片机教程网

快速回复 返回顶部 返回列表