コンピュータの整数表現

コンピュータが扱う情報の最小単位は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の補数はほとんどのコンピュータで採用される、便利な表現方法である。