【C言語入門】16進数と8進数の変換や表示をする方法

C言語では、16進数と8進数を簡単に取り扱うことができます。

この記事では、

・16進数と8進数とは
・16進数と8進数を10進数を変換する方法

という基本的な内容から、

・16進数と8進数の入力と表示をする方法
・16進数と8進数の計算をする方法

などの応用的な使い方に関しても解説していきます。

目次

16進数と8進数とは

16進数とは0~15を一桁とし、16で桁が上がる数値のことを言います。

また、16進数の10以降は10進数と区別をつけるために、A~F(a~fと小文字でも可)の英文字を使って1桁で表すのが特徴です。

16進数はあまり使い慣れないので、10以降の表記はしっかりと覚えておきましょう。

また、8進数とは、0~7を一桁とし8で桁が上がる数値のことを言います。

10進数・8進数・16進数
10進数12345678910111213141516
8進数1234567101112131415161720
16進数123456789ABCDEF10

16進数と8進数は2進数に直すときには相性がよく、16進数は2進数4桁、8進数は2進数3桁で表記します。

16進数と8進数の文字列を10進数に変換する方法

16進数から10進数に変換するためには、strtol関数を使用します。

strtol関数を使うためには、「#include <stdlib.h>」のインクルード文が必要なので忘れずに書きましょう。

strtol関数の使い方は以下のとおりです。

#include <stdlib.h>
strtol(“文字列”, ”変換できない文字列を格納”, 文字列の基数);

・1つ目の引数は変換する文字列を指定します。
・2つ目の引数は変換できない文字列を格納するためのものですが、今回は必要ないのでNULLを指定しています。
・3つ目の引数は文字列の基数(16進数なら16)を指定しています。

実際に16進数から10進数にプログラムを使って変換してみましょう。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    // 16進数⇒10進数
    long num = strtol("ab", NULL, 16);
    printf("16進数abは10進数%ld\n", num);

    // 8進数⇒10進数
    long num2 = strtol("257", NULL, 8);
    printf("8進数257は10進数%ld",num2);

    return 0;
}
 

実行結果

16進数abは10進数171
8進数257は10進数175

上記のプログラムは、16進数abを10進数に、8進数257を10進数に変換しています。

まず、strtol関数で16進数の文字列"ab"をlong型の10進数に変換しています。

次に、「printf(%ld,num)」でlong型の数値を10進数で出力しています。

また、%lはlong型を表しており、%ldと組み合わせることでlong型を10進数で出力と詳細なことまで設定できます。

8進数から10進数への変換も同様の方法で行っています。

16進数と8進数の入力と表示をする方法

次に16進数と8進数の入力と表示をやってみましょう。

ユーザから入力を受け付けるときにはscanf関数を、出力するときにはprintf関数を使用します。

// ユーザからの入力
scanf(“書式文字列”, &引数);
 
// 出力
printf(“文字列”, 引数);

scanf関数の文字列を変数に格納するときには変数の前に「&」をつけましょう。

実際のプログラムを見て使い方の違いを確認してみましょう。

#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    
    int input;
 
    printf("16進数0~9、A~Fを入力してください\n");
    fflush(stdout);
    scanf("%x", &input);
 
    printf("16進数%xは、10進数%dです\n", input, input);
 
    printf("8進数0~7を入力してください\n");
    fflush(stdout);
    scanf("%o", &input);
 
    printf("8進数%oは、10進数%dです\n", input, input);
 
    return 0;
}

実行結果

16進数0~9、A~Fを入力してください
abc
16進数abcは、10進数2748です
8進数0~7を入力してください
2517
8進数2517は、10進数1359です

上記のプログラムは、scanf関数で入力した16進数の値を変数inputに格納しています。

格納した変数inputをprintf関数を使って10進数に変換して表示しています。

また8進数でも同様の方法で10進数に変換しています。

printf関数の特徴として出力するときに%xで16進数%oで8進数に即座に変換できる機能を持っています。

このプログラムの注意点として、統合開発環境(IDE)でよく使われるEclipseの場合、scanf関数の前にprintf関数があると正常に表示されません

Eclipseの環境の人のみ、scanf関数の直前にfflush(stdout);と1行追加しましょう。

それ以外の環境の人は、fflush(stdout);は不要です。

16進数と8進数の計算をする方法

C言語では、16進数や10進数、8進数が混合していてもきちんと計算し、それぞれ表示することが可能です。
実際にプログラムを組んでみましょう。

#include  <stdio.h>
 
int main(void) {
    int result;
    int num1 = 0xab;      // 16進数
    int num2 = 06;        // 8進数
    int num3 = 10;        // 10進数
 
    result = num1 + num2 + num3;
 
    printf("10進数%d\n", result);
    printf("16進数%x\n", result);
    printf("8進数%o\n", result);
 
    return 0;
}

実行結果

10進数187
16進数bb
8進数273

上記のプログラムでは、num1に16進数、num2に8進数、num3に10進数を代入しています。

num1からnum3までそれぞれ足し算をし、その結果をresultに代入しています。

結果をそれぞれ10進数、16進数、8進数で表示しています。

16進数や8進数の場合、10進数と区別をつけるために、16進数は数字やアルファベットの前に0x8進数は数字の前に0をつける必要があります。

このようにC言語では、全く違う進数同士でも計算できることが確認できました。

まとめ

この記事では16進数と8進数について解説しました。

printf関数で16進数と8進数に簡単に変換して表示できることを学びました。

また進数が違うもの同士計算できることも理解しました。

もし、16進数と8進数について忘れてしまったらこの記事を確認してくださいね!

この記事を書いた人

フリーライター。
主に美容系、ライフスタイル系含めこれまでに500本以上執筆。
趣味はオンラインゲームにフリーソフトの情報収集。


プログラミンとの出会い
-----------------------------------------------------------------------------------------
PCとプログラミングは大学からです。
それまでは、PCは触ると壊れると思い込んでました。

大学の授業で面白そうな理由でJavaを専攻。
全然授業についていけず、後ろの席の子に課題をやってもらってました。

そんなプログラミング音痴な状態で社会人を迎え、先輩からVBAがオススメと言われVBAを職場の人から教えてもらい習得。
その後、自分の業務に携わるものおは全てVBAを組みました。

会社を退職後、再度Javaを勉強する機会に恵まれ、大学でわからなかったことが一気に理解できるように。
念願のAndroidアプリでTwitterのクライアントアプリを作れるまでになりました。
以後、文章の修行の傍らJavaの最新情報を追う日々が続いています。

目次