打印
[MCU新闻]

十进制转十六进制源代码

[复制链接]
3108|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 | 只看该作者
#include "stdio.h" 
int main()
{
int num=0;
int a[100];
int i=0;
int m=0;
int yushu;
char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
printf("请输入一个十进制整数:");
scanf("%d",&num);
while(num>0)
{
yushu=num%16;
a[i++]=yushu;
num=num/16;

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

}
printf("\n");
}

使用特权

评论回复
板凳
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 | 只看该作者
char buffer [33]; //用于存放转换好的十六进制字符串,可根据需要定义长度

char * inttohex(int aa)
{
    itoa (aa, buffer, 16);
    return (buffer);
}

使用特权

评论回复
5
yiyigirl2014| | 2017-6-23 15:21 | 只看该作者
2. sprintf(str,"%x",value);str是转化存储的位置,%x表示十六进制格式,value是要转化的数字。所以代码可以为:

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

char * inttohex(int aa)
{
    sprintf(buffer, "%x", aa);
    return (buffer);
}

使用特权

评论回复
6
yiyigirl2014| | 2017-6-23 15:21 | 只看该作者
如果参数只要两位数的整数,那么很简单。代码如下:
char buffer [3]; //用于存放转换好的十六进制字符串。由于只要支持2位整数,所以长度3即可

char * inttohex(int aa)
{
    if (aa / 16 < 10)   //计算十位,并转换成字符
        buffer[0] = aa / 16 + '0';
    else
        buffer[0] = aa / 16 - 10 + 'A';
    if (aa % 16 < 10)   //计算个位,并转换成字符
        buffer[1] = aa % 16 + '0';
    else
        buffer[1] = aa % 16 - 10 + 'A';
    buffer[2] = '\0';   //字符串结束标志
    return (buffer);
}

使用特权

评论回复
7
yiyigirl2014| | 2017-6-23 15:24 | 只看该作者
如果参数是任意整数,由于计算方法是每次都除以16和对16取余数,余数以倒序的顺序排列就是结果,所以最佳方法是用递归函数(当然循环也可以,但需要最后再进行倒序)。递归代码如下:
char buffer [33]; //用于存放转换好的十六进制字符串,可根据需要定义长度

char * inttohex(int aa)
{
    static int i = 0;
    if (aa < 16)            //递归结束条件
    {
        if (aa < 10)        //当前数转换成字符放入字符串
            buffer[i] = aa + '0';
        else
            buffer[i] = aa - 10 + 'A';
        buffer[i+1] = '\0'; //字符串结束标志
    }
    else
    {
        inttohex(aa / 16);  //递归调用
        i++;                //字符串索引+1
        aa %= 16;           //计算当前值
        if (aa < 10)        //当前数转换成字符放入字符串
            buffer[i] = aa + '0';
        else
            buffer[i] = aa - 10 + 'A';
    }
    return (buffer);
}

使用特权

评论回复
8
yiyigirl2014| | 2017-6-23 15:26 | 只看该作者
最后测试代码如下(以sprintf为例,其余只要替换inttohex函数中的代码内容即可):
#include <stdio.h>
#include <stdlib.h>

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

char * inttohex(int aa)
{
    sprintf(buffer, "%x", aa);
    return (buffer);
}

int main ()
{
  int num;
  char * hex_str;
  printf ("Enter a number: ");
  scanf ("%d",&num);
  hex_str = inttohex (num);
  printf ("Hexadecimal number: %sH\n", hex_str);
  return 0;
}

使用特权

评论回复
9
huangcunxiake| | 2017-6-24 13:20 | 只看该作者
一般不需要吧,只有打印时才区分这个

使用特权

评论回复
10
稳稳の幸福| | 2017-6-25 16:04 | 只看该作者
从来没用过这个,只在打印时候有,都是格式化输出

使用特权

评论回复
11
zhuotuzi| | 2017-6-25 16:19 | 只看该作者
如果需要直接格式化打印输出层就行了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

207

主题

3379

帖子

10

粉丝