Cは負の整数をどのように表しますか?
2の補数表現によるものですか、それともMSB(最上位ビット)を使用したものですか?
-116進数ではffffffff。
だから私のためにこれを明確にしてください。
Cは負の整数をどのように表しますか?
2の補数表現によるものですか、それともMSB(最上位ビット)を使用したものですか?
-116進数ではffffffff。
だから私のためにこれを明確にしてください。
ISO C(C99 section 6.2.6.2/2この場合、標準(a)の後の反復に引き継がれます)は、実装が積分データ型の3つの異なる表現、2の補数、1の補数、または符号/大きさのいずれかを選択する必要があると述べています(ただし、信じられないほどです) 2の補数の実装が他の実装をはるかに上回っている可能性があります)。
これらすべての表現において、正の数は同一であり、唯一の違いは負の数です。
正の数の負の表現を取得するには、次のようにします。
これは、以下の表で確認できます。
番号| 2の補数| 1の補数| 符号/大きさ
======= | ===================== | ==================== = | ====================
5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101
-5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101
ISOは、表現ですべてのビットを使用することを義務付けていないことに注意してください。符号ビット、値ビット、パディングビットの概念を紹介します。今、私は実際にパディングビットを使用した実装を見たことがありませんが、C99の理論的根拠のドキュメントから、次のような説明があります。
マシンが16ビットショートのペア(それぞれに独自の符号ビットを持つ)を使用して32ビットintを構成し、この32ビットintで使用される場合、下位ショートの符号ビットは無視されるとします。次に、32ビットのsigned intとして、32ビットのsigned intの値を決定する際に無視されるパディングビット(32ビットの中央)があります。ただし、この32ビット項目が32ビットのunsigned intとして扱われる場合、そのパディングビットはユーザーのプログラムに表示されます。C委員会は、このように動作するマシンがあると言われました。これが、C99にパディングビットが追加された理由の1つです。
彼らが参照していた可能性のあるマシンは、Datacraft 6024(およびHarris Corpの後継機)だったと思います。これらのマシンでは、符号付き整数に24ビットの単語が使用されていましたが、より広い型が必要な場合は、単語の1つの符号ビットが無視された47ビット値として2つをつなぎ合わせました。
+---------+-----------+--------+-----------+
| sign(1) | value(23) | pad(1) | value(23) |
+---------+-----------+--------+-----------+
\____________________/ \___________________/
upper word lower word
(a)興味深いことに、他の2つの方法を実際に使用する最新の実装が不足していることを考えると、 2の補数を1つの真の方法として受け入れることが求められています。これはC++標準ではかなり長い道のりを歩んでおり(WG21はこれを担当するワークグループです)、現在はCでも検討されているようです(WG14による)。
Cは、符号付き整数の符号/大きさ、1の補数、および2の補数表現を許可します。最も一般的なハードウェアは、整数に2の補数を使用し、浮動小数点に符号/大きさを使用します(さらに別の可能性として、浮動小数点指数の「バイアス」表現)。
-16進数の-1はffffffffです。ですから、この点について私を明確にしてください。
2の補数(最も一般的に使用される表現)では、最上位ビット(MSB)を除く各ビットの右から左(桁違い)の値は2 nで、nはゼロから1ずつ増加します。MSBの値は-2nです。
したがって、たとえば8ビットの2の補数整数では、MSBの桁数は-2 7(-128)であるため、2進数:111111112は-128+0111 1111 2 = -128 + 127=-1に等しくなります。
2の補数の便利な機能の1つは、プロセッサのALUが、右側のオペランドの2の補数を形成することにより、減算を実行するために加算器ブロックのみを必要とすることです。たとえば、10-6は10+(-6)と同等です。8ビットバイナリ(説明を簡単にするため)では、これは次のようになります。
0000 1010
+1111 1010
---------
[1]0000 0100 = 4 (decimal)
ここで、[1]は破棄されたキャリービットです。もう一つの例; 10-11 == 10 +(-11):
0000 1010
+1111 0101
---------
1111 1111 = -1 (decimal)
2の補数のもう1つの特徴は、ゼロを表す単一の値があるのに対し、符号の大きさと1の補数にはそれぞれ2つの値があることです。+0および-0。
整数型の場合、通常は2の補数です(実装固有)。浮動小数点には、符号ビットがあります。