3

signed charC++ Primer 第 5 版の本を読んで、値が の a256が定義されていないことに気付きました。私はそれを試すことにしましたがstd::cout、その char 変数ではうまくいかないことがわかりました。(何も印刷されていません)。

しかし、C では、同じこと signed char c = 256; で の値が得られ0ますchar c

検索してみましたが、何も見つかりませんでした。

誰かが私になぜこれがC ++に当てはまるのか説明できますか?

編集: 256 が 2 バイトであることは理解していますが、なぜ C と同じことが C++ で起こらないのでしょうか?

4

6 に答える 6

10

その本はひどく間違っています。未定義の動作はありません

signed char c = 256;

256型の整数リテラルですint。これで a を初期化するには、 (§8.5 [dcl.init]/17.8; すべての参照は N4140 へ) にsigned char変換されます。signed charこの変換は、§4.7 [conv.integral] によって管理されます。

1 整数型の prvalue は、別の整数型の prvalue に変換できます。スコープのない列挙型の prvalue は、整数型の prvalue に変換できます。

2 宛先タイプが署名されていない場合、[...]

3 宛先タイプが符号付きの場合、宛先タイプ (およびビットフィールド幅) で表現できる場合、値は変更されません。 それ以外の場合、値は実装定義です。

256 を表すことができない場合signed char、変換によって type の実装定義の値が生成されsigned char、それが初期化に使用されますc。ここには未定義のものはありません。


「符号付きオーバーフローは UB である」と人々が言うとき、彼らは通常、§5 [expr]/p4 のルールを参照しています。

式の評価中に、結果が数学的に定義されていないか、その型の表現可能な値の範囲内にない場合、動作は未定義です。

これにより、UB 式が次のようにレンダリングINT_MAX + 1されます。オペランドは両方ともintであるため、結果の型もintですが、値は表現可能な値の範囲外です。このルールはここでは適用されません。唯一の式は256であり、その型はintであり、256 は明らかに の表現可能な値の範囲内にありますint

于 2015-02-11T12:07:55.063 に答える
3

coutとの違いがわかりますprintfcout数値表現を取得しないで文字を出力すると、単一の文字が取得されます。この場合、文字はNUL画面に表示されません。

http://ideone.com/7n6Lqcの例を参照してください。

于 2012-11-26T17:13:20.390 に答える
2

char は一般に8 bitsまたは であるため、異なる値byteを保持できます。2^8の場合unsignedから0255それ以外の場合signedから から-128127

于 2012-11-26T17:04:38.693 に答える
0

@Pubby C/C++ 標準が符号付き整数オーバーフロー時の動作を定義しているかどうかはわかりませんが、gcc は常に (x < x + 1) を true として扱うとは限りません。"<" 演算子は符号付き int をオペランドとして使用するため、x < x + 1 --> (int)x < (int)x + (int)1

次のコードは出力を生成します: 1 0 0 0 (32 ビット Linux + gcc)

signed char c1, c2; 
signed int i1, i2; 

c1 = 127;
c2 = c1 + 1;

i1 = 2147483647;
i2 = i1 + 1;

printf("%d %d\n", c1 < c1 + 1, c1 < c2);
printf("%d %d\n", i1 < i1 + 1, i1 < i2);
于 2014-02-22T13:52:05.877 に答える