2

ご存知のように、char は 8 ビットなので、0 から 255 までの値を格納できます。

369 のような大きな値で char を初期化すると、113 と同じバイナリ パターンが得られます。つまり、MSVC12 では 01110001 になります。

それは標準ですか、それとも未定義の動作ですか?

4

4 に答える 4

5

Notice that 369 - 256 == 113.

4.7 Integral conversions, paragraphs 2 & 3:

If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2^n where n is the number of bits used to represent the unsigned type).

If the destination type is signed, the value is unchanged if it can be represented in the destination type (and bit-field width); otherwise, the value is implementation-defined.

But whether char means the same as unsigned char or signed char is also implementation-defined.

So this behavior does depend on the compiler, although most will do it this way.

于 2012-10-29T13:22:30.633 に答える
3

標準charでは、サイズは 8 ビットである必要はなく、符号付きまたは符号なしの両方が可能であるため、実装によって定義されます。

C++11 標準からの引用:

3.9.1 基本型 [basic.fundamental]

文字 (char) として宣言されたオブジェクトは、実装の基本文字セットのメンバーを格納するのに十分な大きさでなければなりません。

...

char オブジェクトが負の値を保持できるかどうかは実装定義です。

于 2012-10-29T13:29:39.420 に答える
2

あふれます。369 - 256 = 113。

于 2012-10-29T13:19:39.343 に答える
2

Acharは必ずしも 8 ビットではありません。プラットフォームに応じて、任意のビット数にすることができます。お使いのプラットフォームcharで が 8 ビット型であっても、その範囲が0..255. 型は署名することができます。つまり、その範囲は-128..+127(2 の補数表現を想定して) になります。

プラットフォームで char 型がたまたま 8 ビットで符号なしの場合、この動作は保証されます。符号なし整数型は、モジュロ演算の規則に従います。369は、モジュロ256および生成時に切り捨てられることが保証されています113

プラットフォームで char 型が 8 ビットで符号付きの場合、動作は実装定義です。

于 2012-10-29T13:26:49.887 に答える