整数変換をクリアした学習者が次に直面する高いハードルが、「小数」と「マイナスの数値」の取り扱いです。ここを曖昧にしたまま放置すると、プログラミング時の深刻なバグや試験での失点に直結します。
まず、2進数小数の10進数変換を見ていきましょう。小数点の右側に向かうにつれて、重みは「2のマイナス乗」、すなわち半分(2分の1)ずつ小さくなっていきます。
・小数第1位:2の-1乗 = 0.5(1/2)
・小数第2位:2の-2乗 = 0.25(1/4)
・小数第3位:2の-3乗 = 0.125(1/8)
・小数第4位:2の-4乗 = 0.0625(1/16)
たとえば、2進数の「0.101」を10進数に直す場合、立っているビットは小数第1位と第3位です。したがって、0.5 + 0.125 = 0.625 と計算します。整数と完全に同じ対称構造であることが分かれば、恐怖心は消えるはずです。
ただし、ここで知っておくべき決定的な事実があります。10進数では当たり前に表現できる「0.1」という小数は、2進数に変換しようとすると割り切れず、「0.0001100110011...」と無限小数のループ(循環小数)に陥ります。コンピュータの内部で小数を扱う際、ごくわずかな計算誤差(丸め誤差)が発生するのはこれが原因です。
次に、マイナスの数値をどう扱うかという問題です。コンピュータは物理的に「+」や「−」という記号を保持できません。そこで用いられるのが、補数と負の数の表現です。現代のコンピュータでは「2の補数」という仕組みが標準化されています。
たとえば8ビット空間において、最上位ビット(MSB:左端の桁)は符号を表すサインビットとして機能します。最上位が「1」であれば負の数です。2の補数から10進数を得るには、「全ビットを反転(0と1を逆転)させ、1を足して、マイナスを付与する」というルールに従います。
さらに、これら数値の演算をハードウェアレベルで高速実行するのがビット演算と桁上がりです。ビットを左に1つずらす(左シフト)と数値は2倍になり、右にずらす(右シフト)と半分になります。CPUはこのシフト演算と論理積(AND)・論理和(OR)・排他的論理和(XOR)を組み合わせ、繰り上がり(キャリー)を伴う加算器を構成してあらゆる高度な計算を実現しているのです。