1. 程式人生 > >c 十進位制數轉十六進位制

c 十進位制數轉十六進位制

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