こんにちは!
寝不足で 頭が回らないちょこひです。

最近暑くて寝つきが悪い・・・
もちろんエアコンフル稼働ですが、夜は寝冷えは嫌でかなり弱くしていて
たぶん弱すぎて暑くて寝れない。
意味ないじゃん。

暑がりで四季の中で夏がダントツで嫌いなのです。
夏の屋外フェスとか夏のディズニーとかわけがわかりませんもん。
夏は引きこもるに限る。


補数表現

今回は基本情報第二弾。
「補数表現」についてアレします。
補数表現は、PC内部で減算や負の数の保持に使われている表現方法です。

8 - 4 = 4

これと、

8 + (-4) = 4


これは同じ計算ですね。
強いて言うなら、「直接減算している」のか、「負の数を加算」しているのか。

PCではこれらの演算を簡単にするために
負の数を加算する、という回路で処理しています。
その負の数を保持するために補数というややこい奴が登場しています。

補数とは、文字通り「補う数」。

10進数で考えてみると、

123の9の補数は「876」。
123の10の補数は「987」。

これらは、

123を999にするために876を「補っている」という考え方。
123を1000にするために876を「補っている」という考え方。
桁を繰り上げするために876を「補っている」という考え方。

と言えます。
へ〜。そうなんだ〜くらいで大丈夫。

2進数で考えてみると、
1の補数と2の補数しか存在しませんね。2進数ですから。

0101の1の補数は「1010」。
各ビットを反転するだけでOKですね。楽チン。

じゃあ、2の補数は?

ここで考えなければならないのは、2進数に2という数字は登場しないことです。
2になる前に、桁が繰り上がります。

2の補数によって、2進数は繰り上がる、という考え方ですね。


絶対値


負の数を算数で習い始めて最初に聞いた言葉、絶対値
なんかすごくつよそう。

絶対値は、0からの距離のこと。

「絶対値が6の数は?」と聞かれたら
答えは6と-6の二つです。

これらを加算したら、もちろん0になる。

補数表現はこの性質を利用しています。

正の数なのか負の数なのかを最上位ビットで保持しておいて、
負の数の場合は対となる正の数の補数で表現しよう!


というものです。



前述の1の補数を加算すると、
そのビット数で表現できる一番大きな数
→繰り上げしないギリギリの数 になります(以下参照)

blog0708_1


2の補数は、これより1大きければいいので
①ビットを反転
②1を加算

すれば求められます。

0110 を例にすると、

①反転
 0110 → 1001

②1を加算
 1001 → 1010


blog0708_2

例のように4ビットで考えると、
最上位の1は無視されて加算結果が0になったかのように見えます。

これが補数を使った負の数の表現です。


一言でまとめるなら

繰り上がるのに必要な数を絶対値が同じもののペアで認識する

という感じでしょうか。



まとめ


最初は何を言っているのかわからなかった補数表現。
最上位ビットが0なら正の数、1なら負の数。

残ったビットで絶対値表現すればいいのに!
と思っていましたが、やっとこさ理解できました。


これ、まだ参考書の1章なんですよ・・・あかんですよ・・・



ちょこひ