読者です 読者をやめる 読者になる 読者になる

実際にint型のビット列を表示してみる&2の補数になってることを確かめる

百聞不如一見

百聞は一見に如かずシリーズ第一弾(?)
コンピュータの世界は01の世界とは言ったものの、普段目にするのは10進数とか文字列とかなので、なかなか実態をリアルに想像できないことが多いです。
最近、コンピュータサイエンスを基礎から復習する熱が高まってきているので、int型の整数を実際にビット表示して、どうなってんのか調べてみました。

/* 整数をビット表示する */
#include <stdio.h>

main()
{
    int x;
    void displayBits(int);

    while (1) {
        printf("符号付き整数を入力して下さい:");
        scanf("%d", &x);
        displayBits(x);
    }
    return 0;
}

void displayBits(int value)
{
    size_t sz = sizeof(int);
    int c, displayMask = 1 << sz * 8 - 1;

    printf("%+d = ", value);

    for (c = 0; c < sz * 8; c++) {
        putchar(value & displayMask ? '1' : '0');
        value <<= 1;

        if (c % 8 == 7)
            putchar(' ');
    }

    putchar('\n');
}

これを実際に動作させてみると

符号付き整数を入力して下さい:100
+100 = 00000000 00000000 00000000 01100100 
符号付き整数を入力して下さい:-100
-100 = 11111111 11111111 11111111 10011100 
符号付き整数を入力して下さい:256
+256 = 00000000 00000000 00000001 00000000 
符号付き整数を入力して下さい:-256
-256 = 11111111 11111111 11111111 00000000 
符号付き整数を入力して下さい:987654321
+987654321 = 00111010 11011110 01101000 10110001 
符号付き整数を入力して下さい:-987654321
-987654321 = 11000101 00100001 10010111 01001111 

これ見てみると、負の数はやっぱり2の補数になってるんだなぁー、というのがよく分かりますね。
ついでに整数をオーバーフローさせてみしょう。

符号付き整数を入力して下さい:2147483646
+2147483646 = 01111111 11111111 11111111 11111110 
符号付き整数を入力して下さい:2147483647
+2147483647 = 01111111 11111111 11111111 11111111 

次の数はどうなるのでしょう

符号付き整数を入力して下さい:2147483648
+2147483647 = 01111111 11111111 11111111 11111111

なるほどなるほど。じゃあ負の数だったらどうでしょう

符号付き整数を入力して下さい:-2147483647
-2147483647 = 10000000 00000000 00000000 00000001 
符号付き整数を入力して下さい:-2147483648
-2147483648 = 10000000 00000000 00000000 00000000 
符号付き整数を入力して下さい:-2147483649
-2147483648 = 10000000 00000000 00000000 00000000 

こうやって実際に見てみると、コンピュータの中身がよりリアルに想像できるようになっていいですね。
百聞は一見に如かず