【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進数について忘れてしまったらこの記事を確認してくださいね!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次