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

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

中井

中井

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

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

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

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

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