web-dev-qa-db-ja.com

負の符号付き値はどのように保存されますか?

私はこれを見ていました ビデオ 符号付き整数の最大値と最小値について。

正の符号付き値の例を取る-0000 0001最初のビットは数値が正であることを示し、最後の7ビットは数値そのものです。したがって、+ 1と簡単に解釈されます。

ここで、負の符号付きの値の例を考えてみましょう-1000 0000は-8になります。さて、コンピュータは最初のビットのためにそれが負の値であることを理解できますが、000 0000が-8を意味することは一体どうやって理解できますか?

一般に、負の符号付き値はどのようにコンピューターに保存/解釈されますか?

14
discussedtree

C標準は、負の符号付き数値を表す特定の方法を義務付けていません。

遭遇する可能性が高いほとんどの実装では、負の符号付き整数は、いわゆる2の補数に格納されます。負の符号付き数値を格納する他の主要な方法は、1の補数と呼ばれます。

Nビット数の2の補数xは、2^N - xとして定義されます。たとえば、8ビットの2の補数12^8 - 1、または1111 1111です。 8ビットの2の補数82^8 - 8で、バイナリでは1111 1000です。これは、xのビットを反転して1を追加することでも計算できます。例えば:

 1      = 0000 0001
~1      = 1111 1110
~1 + 1  = 1111 1111
-1      = 1111 1111

 21     = 0001 0101
~21     = 1110 1010
~21 + 1 = 1110 1011
-21     = 1110 1011

Nビット数xの1の補数は、基本的にすべてのビットが反転したxとして定義されます。

 1      = 0000 0001
-1      = 1111 1110

 21     = 0001 0101
-21     = 1110 1010

2の補数には、1の補数よりもいくつかの利点があります。たとえば、「負のゼロ」という概念はありません。これは、多くの人を混乱させる正当な理由があります。加算、乗算、および減算は、2の補数で実装された符号付き整数でも、符号なし整数と同様に機能します。

30
Miles Rout

バイナリで負の値を表すには、3つのよく知られた方法があります。

  1. 符号付きの大きさ。これは、負の10進値を処理するときと同じように機能するため、理解するのが最も簡単です。最初の位置(ビット)は符号(0は正、1は負)を表し、他のビットは数値を表します。 。理解するのは簡単ですが、特に負の数値を使って算術演算を行う場合は、コンピュータを操作するのは困難です。
    8ビットの符号付きマグニチュードでは、値8は0 0001000として表され、-8は1 0001000として表されます。

  2. 1の補数。この表現では、負の数は、符号ビットだけでなくすべてのビットを反転することにより、対応する正の数から作成されます。これにより、コンピューターで負の数を扱うのが容易になりますが、+ 0と-0の2つの異なる表現があるという複雑な問題があります。すべてのビットの反転は、これを人間に理解するのを難しくします。
    8ビットの1の補数では、値8は00001000として、-8は11110111として表されます。

  3. 2の補数。これは、コンピューターでは最も扱いやすいので、負の整数で現在最も一般的に使用されている表現ですが、人間にとっては理解するのが最も困難です。 1の補数と2の補数の間で負の値に使用されるビットパターンを比較すると、2の補数の同じビットパターンが次に小さい数をエンコードすることがわかります。たとえば、11111111は、1の補数で-0、2の補数で-1を表し、同様に10000000を表します(-127 vs -128)。
    8ビットの2の補数では、値8は00001000として、-8は11111000として表されます。

符号付き整数は http://en.wikipedia.org/wiki/Two%27s%20complement を使用して保存されます

それからあなたは得ます:

000   0
001   1
010   2
011   3
100   -4
101   -3
110   -2
111   -1

基本的には非常に簡単に数えることができ、符号付き整数の最大値の半分まで数えます。 +1を行い、マイナスにし、カウントダウンを開始します。

2
Pieter B