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