どうもふじわらです
今回は、パソコン内でどのようにマイナス、負数が表現されているのかをまとめてみやした
はい、負数の表示の方法には符号絶対値表現と補数表示があります。
以下はすべて2進数で考えてください。
符号絶対値表示
例えば、二進8ビットのデータがあるとしましょう。
10101101とか、11111011とか01011110です。
符号絶対値表示において、+、-といった符号を表すものは最上位のビットつまり
一番左端のビットによって決まります。そして残りのビットで10進絶対値部分、123, 23, 67とかを表します。
なので、8ビットだと表せる10進数は、-127から127までの間しか表せません。
簡単に言うと、8ビットの場合は一番左の最上位ビットが0なら符号が+、1なら-で、絶対値は残りの7ビットを普通に10進数に変換してしまえばいいということです。逆もしかりです。
感のいい人は気づいたかもしれませんが、10進表現の0は2進表現で2通りの表し方があるんです。8ビットの場合、10000000と00000000の二つです。
補数表示
コンピュータの中では、マイナスの数はその数の絶対値の補数をとって表します。
1の補数と2の補数があります。
1の補数
1の補数は単にビットを反転させたものです。
たとえば、10110の補数は01001です。
簡単ですね。
2の補数
2の補数は1の補数に1を加えたものです。
例えば、100011の2の補数は011101です。(011100に1を足した)
ここで問題です。
5の補数は??
8ビットで答えてください。
5は00000101なので、5の2の補数は11111011となる。
次の問題です。
11101110を10進数に戻してください。
11101110は最上位ビット(左端)が1だからマイナス。
そして、11101110の2の補数をとって絶対値を求める。補数は00010001に1を足すから、00010010となって、16+2=8で、
答えは-8!
2の補数による減算
さあさあ、ここから補数は便利です。
二進数同士の引き算ってめんどくさいじゃないですか。
引き算って、よく考えるとa-b=a+(-b)で表せるじゃないですか、-bってbの補数をとれば簡単に得られますね。
といった具合に補数を使うと二進数の引き算は簡単になります。
例、A-Bを計算します。
A>Bの場合
A=01011111(95)
B=00001100(12)の場合
A-B=A+(-B)を計算すればいいですね。
Bの補数は、11110011+1=11110100だから、
01011111+11110100=101010011となり9ビットになってしまいますが、最上位ビットは無視してかまわないです。なのでA-B=01010011(83)となります。
A<Bの場合
基本的にやることはA>Bの時と同じです。
ただ、計算結果が補数の形で現れるので、10進数に戻す時に、計算結果の補数をとって絶対値を出してそれにマイナスをつければいいだけです。