上位1bitを符号として扱います。上位1bitが0の時は正、1の時は負となります。
したがって、8bitの場合、正では0〜127、負は-128〜-1を表現できます。同様に
16bitでは-32768〜+32767までです。正の場合、下位7bitは上述の符号なし整数と
同じです。負の数については「2の補数」という概念で表現されます。
例えば-5を考えると、+5を2進数で表現すると(00000101)2です。
これの「1の補数」すなわちNOTをとります。(0と1を逆にします。)すると、
(11111010)2です。これに1を加えます。すると(11111011)2
になります。これが「2の補数」の計算の仕方で、(11111011)2=-5と
なります。ちなみにこれを符号なし整数で表すとFBhとなります。
+5が(00000101)2なので、上位1bitの符号を1にして、(10000101)2
が-5になるわけではありません。
2の補数で負の数を表現すると何が便利なのでしょうか? まだ演算装置
(いわゆるCPU)が初期の初期のころ、足し算命令はあったけれど、引き算の
命令がないCPUもありました。そこで足し算だけで引き算をする必要がありま
した。その結果負の数を2の補数として表すことが考え出されたのです。
例えば、「15-3」を考えます。これを15と-3を足すと考えます。
15=(00001111)2=0Fhで、-3=(11111101)2=FDhです。
これを足すと、上述したように9桁以上は無視されて0Ch=12となります。
引き算は行わずに引き算をすることができました。
ところが問題もあります。8bitの場合は-128〜+127までですから、
16進数で表現すると-80h〜+7Fhです。+7Fh=(01111111)2に
1を加えると、(10000000)2となり、上位1bitが1ですので、
これは-80hになります。正の整数に1を足したら負の数になってしまいました。
これをオーバーフローといいます。これについては後述します。