3

C で int を char に代入するとどうなりますか? 左側の余分なビットを常に無視しますか?

例 (4 バイト int):

unsigned char c = 0;
unsigned int i = 500;

c = i; // c is 244

c = i << 24 >> 24; //c is 244

i = i << 24 >> 24; //i is 244

バイナリでは、500is111110100および244is11110100です。

4

1 に答える 1

8

通常、これはまさに起こることです。ISO/IEC 9899:2011 規格のセクション 6.3.1.3 では、この場合に何が起こるかを規定しています。

6.3.1.3 符号付きおよび符号なし整数

  1. 整数型の値が _Bool 以外の別の整数型に変換される場合、その値が新しい型で表現できる場合、その値は変更されません。
  2. それ以外の場合、新しい型が符号なしの場合、値が新しい型の範囲内になるまで、新しい型で表現できる最大値よりも 1 多い値を繰り返し加算または減算することによって、値が変換されます。60)
  3. それ以外の場合、新しい型は署名され、値を表現できません。結果が実装定義であるか、実装定義のシグナルが発生します。

60)規則は、与えられたタイプの式の値ではなく、数学的な値の算術演算を記述します。

あなたのケースは上記の項目 2 に該当します (あなたのキャラクターは署名なしと宣言されているため)。典型的なコンピューター演算では、結果はあなたが説明したとおりになります。

于 2013-08-17T23:54:51.033 に答える