ミドリ黄のプログラミングメモノート

主にUnity(C#)を中心としたプログラムの備忘録

2進数 負の数の表示(補数表現)





負の数の表示

以下では8ビットの整数について考えます



(-1)_{10} (10進数の -1) を2進数で表示する場合は

符号を反転した数値との和が0になればよい

です。つまり、この場合だと
(1)_{10} = (0000 \space 0001)_2
との和が0になればよいので、
1111 1111
が答えになります。

0000 0001 と 1111 1111 の和は
 \begin{array}{rr}
& 0000 \space 0001 \\ +\big{)} 
& 1111 \space 1111 \\
\hline
& 1 \space 0000 \space 0000
\end{array}

となりますが、8ビットで考えているため9ビット目は取り除かれます。すると結果的に答えは
0000 0000
となります。




負数の簡単な計算方法

補数の簡単な求め方は次の通りです。

2の補数を求めるには、各ビットを反転させて1を加算する。
(参考:2の補数 - Wikipedia)


これを参考に(-1)_{10}を求めてみます。
まず、(1)_{10}を2進数に直すと、
0000 0001
となります。

次に、これの各ビットを反転させると、
1111 1110
となります。

これに1を加えると、
1111 1111
となり先ほど求めたものと一致します。



補数を求めるときは「各ビットを反転させて1を加算する」という手法を用いて、求めた結果が正しいかを判断するために「和が0になるかを調べる」という手法を用いると計算ミスが減ると思います




8ビット符号付整数で表現できる最小値

8ビットでの最小値は。
(-128)_{10} = (1000 \space 0000)_2
です。

一方、最大値は
(127)_{10} = (0111 \space 1111)_2
となります。

最大値の絶対値と比較して最小値の絶対値の方が1大きいため、「各ビットを反転させて1を加算する」という手法で最小値は求まりませんが、最大値と最小値の和を求めると、
 \begin{array}{rr}
& 1000 \space 0000 \\ +\big{)} 
& 0111 \space 1111 \\
\hline
& 1111 \space 1111
\end{array}

となり、
(-1)_{10} = (1111 \space 1111)_2
となることから、
(-128)_{10} = (1000 \space 0000)_2
であることは確かめられます。




例題 -42の表現

まず、
まず、(42)_{10}を2進数に直すと、
0010 1010
となります。

次に、これの各ビットを反転させると、
1101 0101
となります。

これに1を加えると、答えが求まるで、
(-42)_{10} = (1101 \space 0110)_2
となります。

(42)_{10} = (0010 \space 1010)_2
との和を求めると0になることが確かめられます。
 \begin{array}{rr}
& 1101 \space 0110 \\ +\big{)} 
& 0010 \space 1010 \\
\hline
& 0000 \space 0000
\end{array}