c 十進位制數轉十六進位制
阿新 • • 發佈:2019-01-06
有3種方式實現,其中兩種是使用系統函式,另一種是直接自己編寫。
使用系統函式實現要加入#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;
}