1

数日前、インターンシップの Microsoft GD オンライン試験を受けました。私は常に、負の数の左シフトは未定義の動作であることを研究してきましたが、その論文には、シフト演算子に関連する 30 のうちほぼ 7 つの質問があり、約 5 つの質問は、負の数を左にシフトすることを含むものであり、「未定義」と言うオプションはありませんでした。行動"。私はそれを見てショックを受けました。それで、私の質問は、この C 標準が変更されたということですか? これは今定義されていますか?質問例:

printf("%d",-1<<10);

I marked its answer as -1024 by the logic 2^10*-1

これをgccで実行したところ、o/pが-1024 nlyになりました(家に帰ったとき)。

4

3 に答える 3

3

ルールは変わっていません。技術的にはまだ未定義です。

C標準からの引用(n1548のセクション6.5.7、パラグラフ4):

E1 << E2 の結果は、E1 左シフトされた E2 ビット位置です。空いたビットはゼロで埋められます。E1 が unsigned 型の場合、結果の値は E1 × 2^E2 となり、結果の型で表現可能な最大値より 1 を法として減じられます。E1 に符号付きの型と非負の値があり、E1 × 2^E2 が結果の型で表現できる場合、それが結果の値です。それ以外の場合、動作は未定義です。

E1が符号なしまたは非負の値で符号付きでない場合、動作は未定義であることが明確に示されています。

于 2012-11-16T06:49:39.370 に答える
2

シフト演算子>>または<<:

オペランドは のintegralタイプまたは対象である必要がありますintegral promotion

右のオペランドが負の値であるか、左のオペランドのビットより大きい場合Undefined behaviour

左オペランドが負>>の場合、それはimplementation defiendandです<< undefined behaviour

K&R Appendix-A より引用

    The shift operators << and >> group left-to-right. For both operators, 

        each operand must be integral, and is subject to integral the promotions. 

The type of the result is that of the promoted left operand. 
The result is undefined if the right operand is negative,
 or greater than or equal to the number of bits in the left expression's type.

            shift-expression:
            additive-expression
            shift-expression << additive-expression
            shift-expression >> additive-expression

            The value of E1<<E2 is E1 (interpreted as a bit pattern) left-shifted E2 bits;

         in the absence of overflow, this is equivalent to multiplication by 2. The value

 of E1>>E2 is E1 right-shifted E2 bit positions. The right shift is equivalent to division

 by 2. if E1 is unsigned or it has a non-negative value; otherwise the result is

 implementation-defined.
于 2012-11-16T06:50:22.787 に答える
-2

おそらく、右のオペランドが負であると考えていましたか?

http://msdn.microsoft.com/en-us/library/336xbhcz(v=vs.80).aspx

于 2012-11-16T06:49:24.897 に答える