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進数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
8進数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 |
16進数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 |
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進数は数字やアルファベットの前に0x、8進数は数字の前に0をつける必要があります。
このようにC言語では、全く違う進数同士でも計算できることが確認できました。
まとめ
この記事では16進数と8進数について解説しました。
printf関数で16進数と8進数に簡単に変換して表示できることを学びました。
また進数が違うもの同士計算できることも理解しました。
もし、16進数と8進数について忘れてしまったらこの記事を確認してくださいね!