私はCの本を読んでいて、著者が言及したテキストがあります。
" if ch (a char variable) is a signed type, then storing 255 in the ch variable gives it the value -1
"。
誰かがそれについて詳しく説明できますか?
8 ビットchar
の s を想定すると、これは実際には実装定義の動作です。値 255 は、符号付き 8 ビット整数として表すことはできません。
ただし、ほとんどの実装では、255 のビットパターンを単純に格納します0xFF
。2 の補数を符号付き 8 ビット整数として解釈すると、これが のビット パターンになり-1
ます。まれな 1 の補数アーキテクチャでは、負のゼロのビット パターンまたはトラップ表現であり、符号と大きさがあり、-127
.
char
255 は符号なし 8 ビット整数または 8 ビットを超える符号付き (または符号なし) 整数として表現できるため、2 つの仮定 (符号と 8 ビットs) のいずれかが満たされない場合、値は¹ 255 になります。 .
CHAR_BIT
¹ 標準では少なくとも 8 であることが保証されていますが、それ以上になる場合もあります。
10進数で試してみてください。3桁しか持てないとします。したがって、符号なしの範囲は 0 ~ 999 です。
999 が実際に -1 (符号付き) として動作できるかどうかを見てみましょう。
42 + 999 = 1041
3 桁しか持てないため、最上位の桁 (桁上げ) を削除します。
041 = 42 - 1
これは、あらゆる基数に適用される一般的な規則です。
これが2の補数のしくみです。ここでそれについてすべて読んでください。
これは動作を保証するものではありません。ANSI / ISO / IEC 9899:1999§6.3.1.3(符号付き整数と符号なし整数の間の変換)の条項3を引用するには:
Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.
bitwise / 2の補数の説明は他の回答に任せますが、標準に準拠signed char
しているものが小さすぎて255を保持できないとは限りません。それらはうまく機能するかもしれません(値255を与えます)。
他のメッセージに古典的な説明があります。私はあなたにルールを与えます:
サイズ n の符号付き型では、1 として設定された MSB の存在は、-2^(n-1) として解釈する必要があります。
この具体的な質問では、char のサイズが 8 ビット長 (1 バイト) であると仮定すると、255 からバイナリは次のようになります。
1*2^(7) +
1*2^(6) +
1*2^(5) +
1*2^(4) +
1*2^(3) +
1*2^(2) +
1*2^(1) +
1*2^(0) = 255
255 equivalent to 1 1 1 1 1 1 1 1.
unsigned char の場合は 255 になりますが、char (signed char と同じ) を扱う場合、MSB は負の大きさを表します。
-1*2^(7) +
1*2^(6) +
1*2^(5) +
1*2^(4) +
1*2^(3) +
1*2^(2) +
1*2^(1) +
1*2^(0) = -1