アプリ版:「スタンプのみでお礼する」機能のリリースについて

2の補数場合、1の補数に比べて表現する範囲が1大きいのは何故ですか?

A 回答 (2件)

普段,私達が使う数値は、+-の符号を付けて正負を使い分けています。



二進数でも、+-符号で表現することができます。

ですが、有限の桁しか使えないコンピュータ上で、全ての数にそのためだけに +-専用のメモリを使うのは無駄です。
そこで、+-を使わない方法が考えられました。
これは、次のようなものです。
(1) 0/1のパターンを、「正負判定条件」によって、正の数を表すパターンと、負の数を表すパターンに分けます。
(2) 正のパターン のときは、「正のパターンから正の値を求める計算」をします。
(3) 負のパターン のときは、「負のパターンから負の値を求める計算」をします。


2の補数、1の補数(今回の場合、より正確に言えば、n桁の2進数における、2/1の補数を使った負数の表現)というのは

(1) 最上位ビットが0なら「正のパターン」、1だったら「負のパターン」
(2) 正のパターンは、0/1をそのまま二進数として解釈する。
(3)負のパターンの場合は、 元のパターンをそのまま二進数と解釈した値から、その補数を求め、それを絶対値とする負の値と解釈する。

例えば。4桁の二進数を考えるときに
1011

(1) 最上位は1だから「負」
(2) 非該当
(3) 元のパターンをそのまま二進数として解釈 → 8+2+1 =11
 11に対する「4桁の二進数の2の補数」は 16 - 11 = 5
  よって、2の補数表現では -5 を意味する。
 11に対する「4桁の二進数の1の補数」は 15 - 11 = 4
  よって、1の補数表現では -4 を意味する。


さて、このようにルールを決めた場合

2の補数表現では、全てのパターンが違う値になります。
4桁の場合、 -8〜7 までの16通りのパターンが重複無く割り当てられます。

ところが、 1の補数表現の場合、ルールをそのまま適用すると
0000 = 正の数→0
1111 = 負の数→ -1 × (15-15) = -0
と 2つのパターンが 0 になってしまいます。
この重複があるので、 -7〜7の15通りにしかならない理由です。


1111だけ特別ルールで -8 、とでもすれば、1の補数表現でも、2の補数表現と同じ範囲になります。
でも、そんな例外は処理が面倒なので、普通はしません。
また、逆に、-8と7 というように正負で範囲が違うのを嫌って、-7までしか使わない、という流儀もあります。
    • good
    • 1

ビットパターンで表現できる数は同じですが、1の補数だとプラスのゼロとマイナスのゼロとあり、2の補数だとゼロは一つだけなので、その分だけ表現できる数が1つ減ります。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!