1. はじめに
こちらの本の第2を読んで学んだことをまとめる
2. コンピュータが情報を2進数で扱う理由
コンピュータ内部がIC(集積回路(Integrated Circuit)の略称で、黒いボディーの両側に数本~数百本のピンが付いたムカデのような形状の部品)と呼ばれる構成されており、ICが持つ全てのピンは、直流電圧 0V か +5V のいずれかの状態になっている。つまり、ピン1本で2つの状態しか表せない
このような特性から、コンピュータでは必然的に情報を2進数で取り扱わなければならない。
コンピュータが取り扱う情報の最小単位は ビット で、2進数の1桁に相当する。
そして、2進数の桁数は、8桁、16桁、32桁、…のように8の倍数とするのが一般的。これは、コンピュータで取り扱う情報の単位が、8桁の2進数を基本としているから。
8桁の2進数のことを バイト という。
つまり、プログラム上で10進数や文字として表される情報であっても、コンパイル後に2進数の値に変換され、プログラム実行時にコンピュータの内部で2進数の情報として扱われる
3. シフト演算
シフト演算とは、2進数で表された数値のけたを左右にシフトする演算である。
シフトして空いた下位桁には、0が入り、最上位桁または最下位桁からあふれてしまった数字はそのままなくなってしまう。下記は、39を2桁左シフトして156になっている。
4. コンピュータでマイナスの値を表現するには?
整数や文字のように対応する2進数の値を設定すればよいが、適切に設定しないと、四則演算などが行いずらくなる。
そこで、2進数でマイナスの値を表す一般的な方法は、最上位桁を符号のために使うこと。
この最上位桁を「符号ビット」と呼ぶ。
符号ビットが0の場合:プラス
符号ビットが1の場合:マイナス
それでは具体例を見てみよう
「-1」を8桁の2進数で表すとどうなるか?
「1は2進数で『00000001』だから、-1は『10000001』だ」と思うでしょう。しかし、答えは、「11111111」になる。
続いてこの理由を見る。
コンピュータは、引き算を行う場合に、内部的に足し算として演算している。そのために、「2の補数」を用いる工夫がされている。
2の補数とは
2進数において、プラスの値でマイナスの値を表すという、なんとも不思議な数。
2の補数を得るには、2進数で表された各桁の数値を全て反転し、その結果に1を加える。
-1を8桁の2進数で表すなら、1すなわち「00000001」の2の補数を求める。最初に各桁の数値を全て反転し「1111110」、その結果に1を加える「11111111」
直感的にはわかりにくいかもしれないが、辻褄はあっている。
例えば「1-1」すなわち、「1+(-1)」という演算をすると答えは0になるはず。
「00000001」+「11111111」=「100000000」となり、溢れた桁の1は消えるので、「00000000」= 0 となった!


