6.正の数から負の数を作る(補数表現)
これまでに説明したように、
●掛け算は足し算でできる。(3×5、は、3を5回加えればできる)
●割り算は引き算でできる。(35÷8、であれば、35-8=27、27-8=19、19-8=11、11-8=3、と4回8を引けば3が余る)
さらに、A-B=A+(-B)と書けることから、
●引き算は、正の数Bから(-B)を作り、Aに加えれば、できる。
以上のことから、足し算の回路と、負の数の作り方が分かれば、計算機の
計算の仕組みは理解できたことになる。
補数表現について
以後、8ビット整数を考えよう。8ビット整数とは、8桁の2進数のことである。
⇒符号ビットが「0」なら0または正の数、「1」なら負の数とする。
上の制約のもとで、8ビット整数を10進整数に対応付けてみる。
2進数の加法法則(0+0=0、0+1=1、1+0=1、1+1=10)という法則の下で、対応を付けると
00000000 ⇔ 「0」
00000001 ⇔ 「1」
00000010 ⇔ 「2」
00000011 ⇔ 「3」
・・・
01111111 ⇔ 「127」
となる。
2進数の加算法則に従うと
11111111 ⇔ X
+ 1 ⇔ 「1」
―――――――――――
100000000
となるが、今は考えている数字の桁が8桁なので、9桁目を考えられないので「無視」する。
すると、100000000=00000000=「0」 となり、
X+1=0
となる負の数(先頭のビットが「1」だから)だから、 「X=-1」が得られる。すなわち、
これに従うと、
11111111 ⇔ 「-1」
+11111111 ⇔ 「-1」
―――――――――――
111111110
同様に9桁目を無視して、「11111110」=「-2」が分かる。
では、「10000000」は何か?
このパターンの0と1を逆転させると、「01111111」で、これは正の数「127」である。当然ながら、
10000000 ⇔ 「X」
+01111111 ⇔ 「127」
―――――――――――
11111111=「-1」
だから、X+127=-1、であり、X=-128、がわかる。
まとめよう。
8ビット整数は、
01111111 = 「127」
00000001 = 「1」
00000000 = 「0」
11111111 = 「-1」
11111110 = 「-2」
10000000 = 「-128」
というように、-128~127までの256個の数字を8桁のビットで表現する。
例題1.次の10進整数を8ビット整数で表現しなさい。
(1). 86 (2). -119
(解)
(1). 86÷16=5...6 、 5÷16=0...5 であるので、86(10)=56(16)。これを2進数に直して
「01010110」
(2). 119÷16=7...7、 7÷16=0...7 であるので、119(10)=77(16)。これを2進数に直して
「01110111」
この0と1を逆転させると、「10001000」を得る。これと、上の「01110111」を加えると「11111111」となるので、
119+「10001000」=-1. よって、「10001000」=-120
ゆえに、-119=「10001000」+1=「10001001」がわかる。
例題2.次の8ビット整数を10進整数に直せ。
(1). 01010101 (2). 11001100
(解)
(1). 小さいほうから位取りして、1+4+16+64=85.
(2). 0と1を逆転した数を考える: 「00110011」
これは、小さいほうから位取りして、1+2+16+32=51.
ゆえに、「11001100」+「00110011」=「11001100」+51=-1
よって、「11001100」=-52. ■
今回のような8ビット整数の表現を「2の補数表現」という。
実際に使用されている整数型は、単精度整数が16ビット整数、倍精度整数が32ビット整数である。
オーバーフローとは
8ビット整数の場合には、127+1=-128、と、正の数に数を加えたら負の数になることがある。
計算可能な範囲を超えて計算してしまう。
これを「オーバーフロー」という。
次回は、いよいよ実数が登場する。
最終更新:2011年10月20日 14:09