web-dev-qa-db-ja.com

負の数は32ビットの符号付き整数でどのように表されますか?

負の数は32ビットの符号付き整数でどのように表されますか? 2の補数ですか、それとも1の補数ですか。または左側の最後のビットは旗のようなものですか?例:(-10)

15
Ahmad Farid

最近のほとんどのコンピューターは、符号付き整数に 2の補数 を使用しますが、ハードウェアアーキテクチャ、プログラミング言語、またはその他のプラットフォーム固有の問題によって異なる場合があります。

2の補数表現の場合、最上位( "左端")ビットは符号ビットと呼ばれ、負の整数で、負でない整数の場合はクリア。しかし、それは単なる「旗」ではありません。詳細については、 ウィキペディアの記事 を参照してください。

17

通常は2の補数です。

4
duffymo

C99標準から:

符号付き整数型の場合、オブジェクト表現のビットは、値ビット、パディングビット、および符号ビットの3つのグループに分けられます。パディングビットは必要ありません。正確に1つの符号ビットが必要です。値ビットである各ビットは、対応する符号なしタイプのオブジェクト表現の同じビットと同じ値を持つ必要があります(符号付きタイプにM個の値ビットがあり、符号なしタイプにNがある場合、M = N)。符号ビットがゼロの場合、結果の値に影響を与えることはありません。符号ビットが1の場合、値は次のいずれかの方法で変更されます。

—符号ビット0の対応する値は否定されます(符号と大きさ)。

—符号ビットの値は-(2N)(2の補数)です。

—符号ビットの値は-(2N-1)(1の補数)です。

符号ビット1とすべての値ビットがゼロ(最初の2つ)の値、または符号ビットとすべての値ビット1(1の補数)の値がトラップ表現であるかどうかと同様に、これらのどちらが適用されるかは実装によって定義されます。または通常の値。符号と大きさ、および1の補数の場合、この表現が通常の値である場合、負のゼロと呼ばれます。

4
jim mcnamara

答えは0110で、前に1が28回繰り返されていると思います。したがって、次のようになります。

1111 1111 1111 1111 1111 1111 1111 0110;

手順:

  1. 10のビット表現は次のとおりです。

    0000 0000 0000 0000 0000 0000 0000 1010;

  2. すべてのビットの0->1および1->0

    1111 1111 1111 1111 1111 1111 1111 0101;

  3. 最後のビットに1を追加し、前のビットに伝播します。

    1111 1111 1111 1111 1111 1111 1111 0110;

===

10を追加することで確認でき、すべてのビットで0が得られます。上記のように、これは2の補数に基づいており、2の補数に従います。

3
yanggao
0xFFFFFFFF = -1
0xFFFFFFFE = -2
0xFFFFFFFD = -3
... 

など

1
zed_0xff

参考までに:negation-> _adding one_。

wiki から引用した8ビットの例として_5_を取り上げます。

_to convert 5 to -5: 0000 0101 - flip -> 1111 1010 - add one -> 1111 1011
_

数値を正から負、またはその逆に変換するトリックがあります。

符号付きビット(左端のビット)を無視してそれらを追加すると、_2^N_が得られます(ここで、Nは数値を表すビットの量です)。

上記の8ビット表現の例のように、5 (0000 0101)-5 (1111 1011)の合計は_1 0000 0000_これは(2 ^ 8)です。

0
Hearen

最上位ビット(左側の最後のビット)は負の数に設定されます。

0
kirk.burleson