web-dev-qa-db-ja.com

符号付きバイトの範囲が-127〜127ではなく-128〜127(2の補数)であるのはなぜですか?

Javaでバイトの範囲が-128から127なのはなぜですか?

128は10000000です。反転、01111111、1を追加すると再び10000000になります

-128は10000000であると結論付けます

したがって、+ 128は2の補数で8ビットで表すことはできませんが、9ビットで表すことができるため、128は010000000であり、その2の補数-128は110000000です。

-128 10000000または110000000の表現は?表現ビットは依存していますか?

なぜ-128を10000000として書き込むのではなく、単純に下位範囲を-127 fot 8ビットにしないのですか?

24
Anubha

符号なしバイトの範囲が-128〜127であるのはなぜですか?

そうではありません。符号なしバイト(8ビットと想定)は0〜255です。

2の補数を使用したsignedバイトの範囲は、 2の補数 の定義から直接、-128〜127です。

01111111 = +127
01111110 = +126
01111101 = +125
...
00000001 = +1
00000000 =  0
11111111 = -1
...
10000010 = -126
10000001 = -127
10000000 = -128

-128 10000000または110000000の表現は?

8ビットでは、10000000、仮想の9ビット表現では110000000

8ビットの場合、単純に下限を-127にしないのはなぜですか?

範囲を-127に人為的に制限しても、あまり達成されません。完全に有効な値を拒否し、一般的にコードをより複雑にします(ビットパターン10000000?)。

39

-128 10000000または110000000の表現は?表現ビットは依存していますか?

はい、2の補数表現はビットに依存します

なぜ-128を10000000として書き込むのではなく、単に下位範囲を-127 fot 8ビットにしないのか

2 ^ 8 =256。したがって、どの表現スキームを使用しても、256の異なる値を表現できるはずです。

また、2の補数システムがどれほど優れているかを理解するために円を描くことができます。

この表を最初に見てください:

Bits    Unsigned 2's complement
00000000    0   0
00000001    1   1
00000010    2   2
01111110    126     126
01111111    127     127
10000000    128     −128
10000001    129     −127
10000010    130     −126
11111110    254     −2
11111111    255     −1

2の補数システムでは、このシステムを理解するために円を描くことができます。

これが4ビットバージョンです。自分で8ビットバージョンを簡単に開発できます。この円は、この2の補体系が実際に何であるかを表しています。その循環システム。つまり、その表現は、与えられた「スパン」に依存します。負の数の8ビットバージョンが同じ負の数の16ビットバージョンと異なるのはそのためです。円で示された4ビットバージョンの同じ負の数と、表で示された8ビットバージョンを比較できます。

                      0000  0
                 1111  -1     0001  1


        1110  -2                       0010  2




  1101  -3                                   0011  3



1100  -4                                       0100  4



  1011  -5                                   0101  5




        1010  -6                       0110  6


                 1001  -7     0111  7
                          1000  -8

補足説明として、2の補数演算は、コンピューター(レジスター、メモリーなど)内の「固定」幅の計算ストレージに適しています。

第一世代のコンピューターでは、ネイティブの小数演算を提供する傾向がありました。しかし、これは、「補完」または「循環」スキームを支持してすぐに放棄されました。なぜなら、10進算術はコンピューターの観点からは奇妙だからです。 「10本の指を持っている」ので、私たちは自然だと思います。これらの指は、祖先の最も初期の計算ツールでした。それが、10進法がとても自然だと思う理由です。その遺伝子に組み込まれています。

17
Aftnix

2の補数の代替は

  • 1の補数 、「負のゼロ」による問題がある
  • 符号/大きさ 、これも負のゼロを持つ
  • 10000000に意味を割り当てないでください。その場合、符号付き8ビット整数を受け入れる多くの関数は、その無効な値をチェックする必要があり、時間を無駄にします。 (このビットパターンを整数NaNとして扱う仮想ハードウェアでコードを実行している場合を除きます。)

そのビットパターンに意味を割り当てるだけの方が簡単で、2の補数表現の自然な意味は-128です。

たとえば、2の補数で、負のマウントであるかどうかのチェックは、その最上位ビットが設定されているかどうかのチェックになります。 10000000が無効なバリアントでは、(擬似コード)

if (highest_bit_zero(x))
    return false;
else if (x == 0b10000000)
    ERROR
else
    return true;

エラーを処理する方法を決定します:)

6
Fred Foo

-128 10000000または110000000の表現は?表現ビットは依存していますか?

9ビットの世界では、110000000になります。16ビットの世界では、1111111110000000になります。少なくとも、2の補数について話している限りは。

なぜ-128を10000000として書き込むのではなく、単に8ビットの下位範囲を-127にしないのですか?

Larsmansが指摘したように、「無効な」値になります。これは常にチェックする必要があります。 ALUが扱いやすいため、2の補数が選択されています。バイト幅が2のべき乗になるように選択されたように(常にそうであるとは限りませんでした)。ハードウェアレベルでは、2の補数の加算は符号なしと同じであるため、特別な命令や追加のハードウェアは必要ありません(補数の場合とは異なります)。

物事がそうであるように、最上位ビットが設定されているすべての値は負であり、最上位ビットが設定されていないすべての値は非負(正またはゼロ)です。簡単ですね。負の範囲が正の範囲よりも1つ大きいことは、2の補数を単純に保とうとすることの単なる成果物です。

3
DevSolar

範囲を enter image description here to enter image description here

enter image description here および enter image description here は同じパターンで表されます。これは良くない。ゼロ以外の整数とその負の値を両方とも同じパターンで表すことはできません。そう - enter image description here は8ビットでは表現できません。 8ビットで表現できる正の最大整数は enter image description here

1000 0000で表される数字は何ですか? の表現を追加しますenter image description here それに:

enter image description here

の良い選択?は enter image description here 。したがって、1000 0000は enter image description here 。 8ビットを使用して数値を表すことができます enter image description here ... 0 ... enter image description here

enter image description here

たとえば、2の補数を使用して8ビットで表現できる整数の範囲は次のとおりです。

Example

正の整数よりも負の整数がもう1つ多いことに注意してください。

ソース: http://programmedlessons.org/AssemblyTutorial/Chapter-08/ass08_20.html

2
Varun