[MCU新闻] 十进制转十六进制源代码

[复制链接]
3303|10
 楼主| zhuomuniao110 发表于 2017-6-23 12:12 | 显示全部楼层 |阅读模式
十进制转十六进制
stack segment'stack'
      dw 32 dup(?)
stack ends
data segment
IBUF DB 6,0,6 DUP(?)
    W DW 0
  HEX DB "0123456789ABCDEF"
OBUF DB 4 DUP(?),'$'
data ends
code segment
begin proc far
      assume ss:stack,cs:code,ds:data
      push ds
      sub ax,ax
      push ax
      mov ax,data
      mov ds,ax
      MOV DX,OFFSET IBUF
      MOV AH,10
      INT 21H
      MOV DL,0AH
      MOV AH,2
      INT 21H
      MOV CL,IBUF+1
      MOV CH,0
      MOV SI,OFFSET IBUF+2
      MOV AX,0
AGAIN:MOV DX 10
      MUL DX
      AND BYTE PTR [SI],0FH
      ADD AL,[SI]
      ADC,AH,0
      INC SI
      LOOP AGAIN
      MOV W,AX
      MOV CX,02
      MOV DI,OFFSET W
      MOV SI,OFFSET OBUF+3
NEXT:MOV AL,BYTE PTR [DI]
      MOV W,AX
      MOV CX,4
      MOV SI,W
      LEA BX,HEX
  ONE:ROL SI,1
      ROL SI,1
      ROL SI,1
      ROL SI,1
      MOV AX,SI
      AND AL,000FH
      XLAT
      MOV DL,AL
      MOV AH,2
      INT 21H
      LOOP ONE
      MOV AX,4C00H
      MOV DX,OFFSET OBUF
      MOV AH,9
      INT 21H
      RET
begin endp
code ends
      end begin呵呵,这个是汇编的,C语音应该用库函数吧。

yiyigirl2014 发表于 2017-6-23 15:19 | 显示全部楼层
  1. #include "stdio.h"
  2. int main()
  3. {
  4. int num=0;
  5. int a[100];
  6. int i=0;
  7. int m=0;
  8. int yushu;
  9. char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  10. printf("请输入一个十进制整数:");
  11. scanf("%d",&num);
  12. while(num>0)
  13. {
  14. yushu=num%16;
  15. a[i++]=yushu;
  16. num=num/16;

  17. }
  18. printf("转化为十六进制的数为:0x");
  19. for(i=i-1;i>=0;i--)//倒序输出
  20. {
  21. m=a[i];
  22. printf("%c",hex[m]);

  23. }
  24. printf("\n");
  25. }
yiyigirl2014 发表于 2017-6-23 15:20 | 显示全部楼层
利用系统函数有

1. char *  itoa ( int value, char * str, int base );value是要转化的数字,str是转化后的字符串存储的位置,base是进制数(但是这个函数不是标准C函数,有些编译器是不支持的!)
yiyigirl2014 发表于 2017-6-23 15:20 | 显示全部楼层
  1. char buffer [33]; //用于存放转换好的十六进制字符串,可根据需要定义长度

  2. char * inttohex(int aa)
  3. {
  4.     itoa (aa, buffer, 16);
  5.     return (buffer);
  6. }
yiyigirl2014 发表于 2017-6-23 15:21 | 显示全部楼层
2. sprintf(str,"%x",value);str是转化存储的位置,%x表示十六进制格式,value是要转化的数字。所以代码可以为:

  1. char buffer [33]; //用于存放转换好的十六进制字符串,可根据需要定义长度

  2. char * inttohex(int aa)
  3. {
  4.     sprintf(buffer, "%x", aa);
  5.     return (buffer);
  6. }
yiyigirl2014 发表于 2017-6-23 15:21 | 显示全部楼层
如果参数只要两位数的整数,那么很简单。代码如下:
  1. char buffer [3]; //用于存放转换好的十六进制字符串。由于只要支持2位整数,所以长度3即可

  2. char * inttohex(int aa)
  3. {
  4.     if (aa / 16 < 10)   //计算十位,并转换成字符
  5.         buffer[0] = aa / 16 + '0';
  6.     else
  7.         buffer[0] = aa / 16 - 10 + 'A';
  8.     if (aa % 16 < 10)   //计算个位,并转换成字符
  9.         buffer[1] = aa % 16 + '0';
  10.     else
  11.         buffer[1] = aa % 16 - 10 + 'A';
  12.     buffer[2] = '\0';   //字符串结束标志
  13.     return (buffer);
  14. }
yiyigirl2014 发表于 2017-6-23 15:24 | 显示全部楼层
如果参数是任意整数,由于计算方法是每次都除以16和对16取余数,余数以倒序的顺序排列就是结果,所以最佳方法是用递归函数(当然循环也可以,但需要最后再进行倒序)。递归代码如下:
  1. char buffer [33]; //用于存放转换好的十六进制字符串,可根据需要定义长度

  2. char * inttohex(int aa)
  3. {
  4.     static int i = 0;
  5.     if (aa < 16)            //递归结束条件
  6.     {
  7.         if (aa < 10)        //当前数转换成字符放入字符串
  8.             buffer[i] = aa + '0';
  9.         else
  10.             buffer[i] = aa - 10 + 'A';
  11.         buffer[i+1] = '\0'; //字符串结束标志
  12.     }
  13.     else
  14.     {
  15.         inttohex(aa / 16);  //递归调用
  16.         i++;                //字符串索引+1
  17.         aa %= 16;           //计算当前值
  18.         if (aa < 10)        //当前数转换成字符放入字符串
  19.             buffer[i] = aa + '0';
  20.         else
  21.             buffer[i] = aa - 10 + 'A';
  22.     }
  23.     return (buffer);
  24. }
yiyigirl2014 发表于 2017-6-23 15:26 | 显示全部楼层
最后测试代码如下(以sprintf为例,其余只要替换inttohex函数中的代码内容即可):
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. char buffer [33]; //用于存放转换好的十六进制字符串,可根据需要定义长度

  4. char * inttohex(int aa)
  5. {
  6.     sprintf(buffer, "%x", aa);
  7.     return (buffer);
  8. }

  9. int main ()
  10. {
  11.   int num;
  12.   char * hex_str;
  13.   printf ("Enter a number: ");
  14.   scanf ("%d",&num);
  15.   hex_str = inttohex (num);
  16.   printf ("Hexadecimal number: %sH\n", hex_str);
  17.   return 0;
  18. }
huangcunxiake 发表于 2017-6-24 13:20 | 显示全部楼层
一般不需要吧,只有打印时才区分这个
稳稳の幸福 发表于 2017-6-25 16:04 | 显示全部楼层
从来没用过这个,只在打印时候有,都是格式化输出
zhuotuzi 发表于 2017-6-25 16:19 | 显示全部楼层
如果需要直接格式化打印输出层就行了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

233

主题

3529

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部