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


12

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

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

次に、負の符号付き値の例を取り上げます。10000000は-8になります。さて、コンピューターは最初のビットのために負の値であることを理解できますが、000 0000が-8を意味することを地獄はどのように理解していますか?

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


nl.wikipedia.org/wiki/Two%27s_complementは、コンピューターに2進数を保存する方法です。
ピーターB

@PieterBたぶんあなたのコンピューター。そして、他の多くの人々の。正当な理由で!しかし、それが唯一の方法であることを意味しないでください。
underscore_d

好きなように。少なくとも256を考えることができます!(8ビット)2進数をコンピューターに保存する方法。しかし、それらのほとんどは非常に愚かです。
カレス

Cは明記していませんが、それは主にチップ製造業者がデータを表現することを決定する方法です。Cはマシンコードにコンパイルされ、チップが数値を格納する方法を再定義しないように注意します。同じ規則が浮動小数点数にも適用されます。それらがどのように保存されるかを定義するのはチップ製造者次第です。ほとんどのチップメーカーは2の補数を使用していますが、例外があると確信しています。
ベリンロリッチュ

回答:


28

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

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

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

 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の補数は、基本的にすべてのビットが反転したxとして定義されます。

 1      = 0000 0001
-1      = 1111 1110

 21     = 0001 0101
-21     = 1110 1010

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


18

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

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

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

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


8
符号付きの大きさにも2つのゼロがあります。
ヨルグWミットタグ

符号/大きさについて言及する場合は+1。珍しくて不便です(人間でない場合はCPUに!)が、知る価値はあります。
underscore_d

私たちのほぼ全員が、特にFP数値では、符号付きマグニチュードで作業します。
Paulo1205

2

符号付き整数は、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を行い、マイナスにしてカウントダウンを開始します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.