2000 年度「計算機基礎論3B」 二進法・八進法・十六進法

コンピュータの中では数は二進法で表わされています。 二進法では数字として 0 と 1 だけを使うため、 長くなるのが欠点です。

十進       45
二進   101101

そこで、八進法や十六進法が使われる場合があります。 十六進では、十から十五までを a, b, ..., f または A, B, ..., F で表わす習慣です。 上と同じ数を書いてみるとこうなります。

八進       55
十六進     2D
二進法から八進法に直すには下から3桁ずつ区切って変換すればいいのがわかりますか?
二進   101 101
        ↓  ↓
八進     5   5
二進法から十六進法に直すには下から4桁ずつ区切ります。
二進法   10 1101
         ↓  ↓
十六進法  2   D

八進法で表わされた数のことを「八進数」と言ったりしますが、 数を文字で表記するやりかたが「十進数」と違うだけで、 新しい数を導入したわけではありませんから注意しましょう。

C言語における扱い

C言語における定数は、 0 で始まっていれば八進と見なされます。 よって、n = 012; と書けば n には 12 ではなく 10 が代入されます。 十六進法の定数は最初に 0x または 0X をつけます。 例えば n = 0x1d; や n = 0x1D; のように。

※ だから、十進数の 0 をC言語のプログラムに書く方法は存在しない (がそれで困らない)。

scanf() や printf() で八進数を扱うには %d の代わりに %o と書きます。 十六進数を printf() で出力するには %x または %X と書きます。 この二つは、十から十五を表わす文字が小文字になるか大文字になるかの違いです。 十六進数を scanf() で入力させるには %x です。 入力する際には 0x1d のように 0x をつけて打ち込んでもいいし、 1d のようにつけないで打ち込んでもいいことになっています。

== hex.c ======================================================================
#include <stdio.h>

main() {
    int n;

    printf("十進で数を入力してください.\n");
    scanf("%d", &n);                            /* 十進で入力 */
    printf("八進では %o です.\n", n);           /* 八進で出力 */
    printf("十六進では %x ", n);                /* 十六進で出力 */
    printf("または %X です.\n", n);             /* 十六進で出力 */

    printf("八進で数を入力してください.\n");
    scanf("%o", &n);                            /* 八進で入力 */
    printf("十進では %d です.\n", n);           /* 十進で出力 */

    printf("十六進で数を入力してください.\n");
    scanf("%x", &n);                            /* 十六進で入力 */
    printf("十進では %d です.\n", n);           /* 十進で出力 */
}
===============================================================================

※ 八進で入力すべきところで数字の 8 や 9 を打ち込むと予想外のことが起こる。 よって、scanf() は実際のプログラミングではあまり使わないのが普通である。

scanf(), printf() は二進法には対応していません。


岩瀬順一