はじめに
どうも! みなため(@MinatameT)です。
この記事では、入力された10進数を16進数に変換するプログラムを紹介します。プログラミング言語はC言語です。
16進数は、0からFまでの数字や文字を使って値を表現するものですね。
あまり難しいものではありませんし、1つずつ確実に理解していけばOKです。
それでは、プログラムをさっそく確認していきましょう。
10進数から16進数に変換するプログラムの例
ソースコード
#include<stdio.h>
#include<math.h>
#include<string.h>
int main(void)
{
int d; //入力値d
char x[17] = "0123456789ABCDEF"; //16進数の配列
char x0[2] = {0}; //16進数の右から1ケタめ
char x1[2] = {0}; //16進数の右から2ケタめ
char x2[2] = {0}; //16進数の右から3ケタめ
char x3[2] = {0}; //16進数の右から4ケタめ
char x4[2] = {0}; //16進数の右から5ケタめ
char xfin[6] = {0}; //16進数に変換した結果
int L; //ループ用変数L
int xv0,xv1,xv2,xv3,xv4; //16進数のそれぞれの桁の重み
printf("0から1048575までの10進数の整数値を入力。>");
scanf("%d",&d); //dに10進数の整数値が入る。
/*16進数の計算*/
xv0 = (int)(d/(pow(16,0)))%16; //16^0の位
xv1 = (int)(d/(pow(16,1)))%16; //16^1の位
xv2 = (int)(d/(pow(16,2)))%16; //16^2の位
xv3 = (int)(d/(pow(16,3)))%16; //16^3の位
xv4 = (int)(d/(pow(16,4)))%16; //16^4の位
for(L=0; L<16; L=L+1)
{
if(xv0==L)
{
strncpy(x0,x+L,1); //x0に、配列xのL番めからの値を1つ分代入する。
}
if(xv1==L)
{
strncpy(x1,x+L,1); //x1に、配列xのL番めからの値を1つ分代入する。
}
if(xv2==L)
{
strncpy(x2,x+L,1); //x2に、配列xのL番めからの値を1つ分代入する。
}
if(xv3==L)
{
strncpy(x3,x+L,1); //x3に、配列xのL番めからの値を1つ分代入する。
}
if(xv4==L)
{
strncpy(x4,x+L,1); //x4に、配列xのL番めからの値を1つ分代入する。
}
}
snprintf(xfin,6,"%s%s%s%s%s",x4,x3,x2,x1,x0); //xfinにx4~x0を連結させたものを代入する。
printf("%d(10進数) = %s(16進数)\n",d,xfin); //16進数に変換した結果を出力する。
return(0);
}
#include<math.h>は、pow関数を使うために必要です。pow関数については、以下の記事を参考にしてください。
#include<string.h>は、strncpy関数を使うために必要です。strncpy関数は、ある文字列を他の文字列に「上書き」するために利用されます。
strncpy関数の使い方については、以下の記事を参考にしてください。
snprintf関数についてですが、左から順番に見ていくと、xfinが代入先です。次に、「6」というのは代入する合計文字数 + 1の値です。次に、%sが5つありますが、これは代入する変数の数だけ%sを書きます。最後に、代入する変数名を「,」で区切って順番に書きます。
snprintf関数の使い方については、以下の記事を参考にしてください。
char配列の宣言時に必要な文字数 + 1のサイズを確保しているのは、終端文字(NULL)が1つ入るためなのですが、ここでは詳しく説明しません。
また、char配列の宣言時に {0}; としているのは、配列の中を0で埋め尽くすため(ゼロクリアー)です。これをしないと、計算結果が間違う可能性があります。
それでは、実行結果を確認していきます。
実行結果の例
0から65535までの10進数の整数値を入力。>55
55(10進数) = 0037(16進数)
これは、入力値の55(10進数)が37(16進数)に変換された様子ですね。
念のため、正解しているかどうか、検算してみましょうか。
右から2ケタめの大きさが3 × 16 = 48です。
最後に、48 + 7 = 55になるので正解ですね。
0から65535までの10進数の整数値を入力。>315
315(10進数) = 013B(16進数)
これは、入力値の315(10進数)が13B(16進数)に変換された様子ですね。
これも、念のために検算してみます。
まず、右から3ケタめの「1」の大きさは、1 × 256 = 256ですね。
次に、右から2ケタめの「3」の大きさは、3 × 16 = 48です。先程も似たような計算をやったような気がしますが、次にいきます。
最後に、一番右の「B」の大きさは、1 × B = 11です。
……ということで、256 + 48 + 11 = 315となります。正解ですね。
今回はここまでです。ややこしい文法もありますが、慣れたら平気です。皆さん、お疲れ様でした。
以下、関連記事です。興味があればどうぞ。