有以下种方式实现,其中两种是使用系统函数,另一种是直接自己编写。

main()
 {
 int u10=0;
 char u16[10];
 int w=0,a,b,i;printf("请输入一个数字-->");
 scanf("%d",&u10);
 //u10=16;
 if(u10==0)
 {
 u16[0]='0';
 w++;
 }
 else
 {
 a=u10;
 while(a)
 {
 b=a%16;
 if(b<10)
 {
 u16[w]='0'+b;
 }
 else
 {
 u16[w]='A'+b-10;
 }
 a=a/16;
 w++;
 }
 }
 printf("\n");
 printf("%d(10)转换为16进制数字为:",u10);
 for(i=w-1;i>=0;i--)
 {
 printf("%c",u16[i]);
 }
 printf("\n");
 }

自己编写的程序:

/将一个任意输入的10进制数转化为16进制形式输出
 #include<stdio.h>
 #define MAXSIZE 11void ten20x(unsigned int a,char *p)
 {
     int i;
     int j = 2;
     int sum = 0;
     int count = 0;
     unsigned int mask = 0x80000000;    *(p + 0) = '0';
     *(p + 1) = 'X';
     *(p + 10) = '\0';
     while(count < 8)
     {
         for(i = 0; i < 4; i++)
         {
             if((a & mask) == mask)
      {
          sum = sum * 2 + 1;
      }
             else
      {
          sum = sum * 2 + 0;
      }
      a = a << 1;
         }
         if(sum < 10)
         {
             *(p + j) = sum + '0';
      j++;
         }
         else
         {
             *(p + j) = sum - 10 + 'a';
      j++;
         }
  sum = 0;
  count++;
     }
  
 }int main()
 {
     unsigned int ver = 0;    char sixtn[MAXSIZE];
    printf("please input a num \n");
     scanf("%d",&ver);
     ten20x(ver,sixtn);
     printf("%d 的16进制为 %s\n",ver,sixtn);
     return 0;
 }


 

 

 

 

 

 

使用系统函数实现要加入#include <stdlib.h>,自己编写则不需要这个头文件。

下面的代码就是3种方式的实现,包括2位的整数和任意整数(2的31次方以内)都可以。可自己选择需要的实现方式。

利用系统函数有

1. char *  itoa ( int value, char * str, int base );value是要转化的数字,str是转化后的字符串存储的位置,base是进制数(但是这个函数不是标准C函数,有些编译器是不支持的!)。所以代码可以为:

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

char * inttohex(int aa)
 {
     itoa (aa, buffer, 16);
     return (buffer);
 }
 2. sprintf(str,"%x",value);str是转化存储的位置,%x表示十六进制格式,value是要转化的数字。所以代码可以为:char buffer [33]; //用于存放转换好的十六进制字符串,可根据需要定义长度
  
 char * inttohex(int aa)
 {
     sprintf(buffer, "%x", aa);
     return (buffer);
 }


3. 自己编写

如果参数只要两位数的整数,那么很简单。代码如下:

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);
 }


如果参数是任意整数,由于计算方法是每次都除以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);
 }

最后测试代码如下(以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;
 }