補数表現について教えてください
nビットのすべてが1である2進法1111…11が表す数値又はその数式はどうして-1になるのでしょうか?負数は2の補数で表します
教えてください
回答(2)
1.
例えば、
1を足すと、
繰り上がりがnビットをオーバーフローし
nビットが0(ゼロ)になります。
1を足して0になる数というと-1ですね
2.
「1の補数を作って(0、1反転)、それに1を加える」という方法です。
そこで、与えられた補数表現が「11・・・11」のとき、それがいくつを表しているかを知るには、上記の2の補数を求めるのと反対のことをするばいいです。つまり、「1を引き、0と1を反転で1の補数をとる」でいいです。
例えば「11・・・11」であれば、これから1を引くと「11・・・10」。ここで1の補数をとると「00・・・01」。これに符号をつけて「-1」です。
「負の整数の見方」の項を参照下さい。
コメント(5)
1を足して0になる数というと-1がよく分かりませんでした
人間様の解釈の問題。
1111111111111111 (?)
+0000000000000001 (1)
------------------
0000000000000000 (0)
ゆえに"1111111111111111"は-1と解釈する。
ここのところがポイント。
たとえば8ビットで,
1001 0011
を考えると,10進数表記では,
1×(-2^7)+0×2^6+0×2^5+1×2^4 + 0×2^3+0×2^2+1×2^1+1×2^0
という風に最上位ビットだけはマイナスの重みになっています.したがって,最上位以外のビットが全て1の場合,
0111 1111
= 0×(-2^7)+1×2^6+1×2^5+1×2^4 + 1×2^3+1×2^2+1×2^1+1×2^0 = 2^7-1
正の数では最大になり,最上位を1にすると,
1111 1111
= 1×(-2^7)+1×2^6+1×2^5+1×2^4 + 1×2^3+1×2^2+1×2^1+1×2^0
= -2^7+2^7-1
= -1
となります.
お解りにならないようであれば、このように考えてください。
16ビットのゼロ表現は、
1111111111111111
+0000000000000001
------------------
0000000000000000
となります(オーバーフローしています)。
-1は"0000000000000000-0000000000000001"のことなので、上記の式を横書きして
1111111111111111+0000000000000001=0000000000000000
を得ます。この式の"0000000000000001"を右辺へ移項してみると、
1111111111111111=0000000000000000-0000000000000001
右辺は-1のはずです。そして左辺は"111‥‥1"になっています。
正しい解釈は、中央処理装置内で行なっている「繰上り」(carry)や「借り」(borrow)の機構を理解しなければなりません。



