4

私はCの本を読んでいて、著者が言及したテキストがあります。

" if ch (a char variable) is a signed type, then storing 255 in the ch variable gives it the value -1"。

誰かがそれについて詳しく説明できますか?

4

5 に答える 5

10

8 ビットcharの s を想定すると、これは実際には実装定義の動作です。値 255 は、符号付き 8 ビット整数として表すことはできません。

ただし、ほとんどの実装では、255 のビットパターンを単純に格納します0xFF。2 の補数を符号付き 8 ビット整数として解釈すると、これが のビット パターンになり-1ます。まれな 1 の補数アーキテクチャでは、負のゼロのビット パターンまたはトラップ表現であり、符号と大きさがあり、-127.

char255 は符号なし 8 ビット整数または 8 ビットを超える符号付き (または符号なし) 整数として表現できるため、2 つの仮定 (符号と 8 ビットs) のいずれかが満たされない場合、値は¹ 255 になります。 .

CHAR_BIT¹ 標準では少なくとも 8 であることが保証されていますが、それ以上になる場合もあります。

于 2012-04-22T00:58:20.073 に答える
3

10進数で試してみてください。3桁しか持てないとします。したがって、符号なしの範囲は 0 ~ 999 です。

999 が実際に -1 (符号付き) として動作できるかどうかを見てみましょう。

42 + 999 = 1041

3 桁しか持てないため、最上位の桁 (桁上げ) を削除します。

041 = 42 - 1

これは、あらゆる基数に適用される一般的な規則です。

于 2012-04-22T00:57:35.910 に答える
2

これが2の補数のしくみです。ここでそれについてすべて読んでください。

于 2012-04-22T00:54:59.917 に答える
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を与えます)。

于 2012-04-22T01:03:15.560 に答える
0

他のメッセージに古典的な説明があります。私はあなたにルールを与えます:

サイズ 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
于 2012-04-22T02:54:22.090 に答える