6
int main(void)  
{  

   unsigned i = -23; // line 1
   short a, b = 0x1;

   printf("sizeof(short) = %i\n", (int)sizeof(short)); // line 2

   a = b << 31; // line 3
   printf("i = %i", i); // line 4
   printf("i = %u", i); // line 5

   return 0;
}

型修飾子 unsigned が指定されている場合、1行目でエラーが発生しないのはなぜですか?

sizeof(short)2 行目は、私のシステムでは 2 バイトとして出力されます。a & b は短い整数であるため、2 バイトまたは 16 ビット長です。しかし、3行目はエラーをスローしません。語長が 16 ビットのみの場合、31 ビットの左シフトはどの程度可能ですか??

4 行目と 5 行目に暗黙的な変換はありますか?

64 ビット Mac で GCC コンパイラを使用しています。

4

3 に答える 3

6
  1. 負の整数定数は暗黙的に符号なしの値に変換され、非常に大きな数値になる (MSB が 1 に設定される) ため、エラーは発生しません。
  2. 値は暗黙的にint1,2に変換され、シフトされ、代入されます。数値を に戻すとすべてゼロになりますがshort、これは未定義の動作です3
  3. 4 行目と 5 行目では、C の意味での変換はありません。可変引数関数への引数の受け渡しに関連する通常の型の昇格は適用されます。ただし、 はprintfunsigned を 4 行目で singed として再解釈します。書式指定子は、printf渡された引数の型を伝える唯一のものです。

1移行前のプロモーション:リンク.

2整数プロモーション:リンク.

32^30は として表現できるため、30 ずつシフトしても問題ありませんint

于 2012-07-25T04:23:37.703 に答える
2

1) 負の整数は、 C99 6.3.1.3UINT_MAX + 1のポイント 2 に従って追加することにより、符号なしに変換されます。

 6.3.1.3 Signed and unsigned integers
 [...]
 2 Otherwise, if the new type is unsigned, the value is converted by repeatedly
 adding or subtracting one more than the maximum value that can be represented
 in the new type until the value is in the range of the new type.

2) ビット シフト演算子へのオペランドは、C99 6.5.7intに従って暗黙的に変換されます。

6.5.7 Bitwise Shift Operators
1 Each of the operands shall have integer type.
2 The integer promotions are performed on each of the operands.
3 The type of the result is that of the promoted left operand.

3) dasblinkenlight の回答を参照してください。

于 2012-07-25T04:41:36.270 に答える
0

代入: 変数に指定する型は、そこに何を入れることができるかを示すのではなく、コンパイラがそれをどのように解釈するかを示します。あなたの場合、-23 は 32 ビットに「変換」され、この値は unsigned int (32 ビットもあります) に入れられます ... (ビット長はアーキテクチャに依存します)

http://en.wikipedia.org/wiki/Two%27s_complement

シフト: シフトすると、片側のビットが「消えて」しまい、反対側のビット (ゼロ) をシフトインする必要があります。必要な回数変数をシフトできます。

Printfing : 繰り返しますが、これは「変換」ではなく、一連のビットの「解釈」に関するものです。

于 2012-07-25T05:16:50.230 に答える