コンピュータの整数表現
コンピュータが扱う情報の最小単位はbit。
bitは2種類の状態を表現でき、bool
typeならばtrue/false
と2種類の状態を表現する。コンピュータはbitをまとめたbyteを単位として情報を扱う。(ここでは1byteを8bitとする)
1byte中の8bitは28 = 256種類の状態を表現できる。
符号なし整数
正の整数を単純に1byteを使って表現すると、0から255までの値を表現することができる。これを符号なし整数(unsigned integer)という。
int max = 0b11111111;
符号付き整数
符号なし整数では負の整数を扱うことができないため、正と負両方の整数を表現するために符号付き整数(signed integer)というものがある。この表現方法は符号bit表現とそれを拡張した補数表現がある。
符号bit
簡単にbyteで正負整数を表現するための表現方法として、符号bitがある。最上位bitを正負の符号として扱い 下位7bitを値として扱う。
0b00000001; // 1 0b10000001; // -1
下位7bitすべてをonにすると-0という表現になり、-128までをあつことはできない。
0b10000000; // -0?
符号bitで表現できる範囲は-127~127となり、問題は0が2つ存在する問題が出る。
2の補数
符号bitのこの問題は2の補填で解消することができる。
まず1の補数とは 全ビットを反転させること
0b00000001; // 1 0b11111110; // -1
となる
この状態から更に1bit足した値を「2の補数」という。
0b00000001; // 1 0b11111110; // -1 全ビット反転 (1の補数) 0b11111111; // -1 全ビット反転 + 1bit (2の補数)
符号bit表現で-1となってしまう値は2の補数表現では-128となり、0の表現方法を1つにすることができる。これにより整数の範囲は-128~127となる。
0b11111111; // -1 0b11111110; // -2 . . . 0b10000000; // -128
引き算
2の補数表現により、引き算を足し算(「負数の作成」+ 「足し算」)で表現することができる。
例: 111 - 17 = 94
111 -> 01101111
17 -> 00010001
-17 -> 11101111 (2の補数)
01101111 + 11101111
01011110 => 94
2の補数はほとんどのコンピュータで採用される、便利な表現方法である。