1

几天前,我参加了微软 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 具有无符号类型,则结果的值为 E1 × 2^E2,比结果类型中可表示的最大值多模一减少。如果 E1 具有带符号类型和非负值,并且 E1 × 2^E2 在结果类型中是可表示的,那么这就是结果值;否则,行为是未定义的。

它清楚地表明如果E1不是无符号或非负值签名,则行为未定义。

于 2012-11-16T06:49:39.370 回答
2

在移位运算符中>><<

操作数应该是integral类型或服从integral promotion

如果右操作数为负数或大于左操作数中的位,则Undefined behaviour

如果左操作数是负数,>>那么它是implementation defiend<< undefined behaviour

引自 K&R 附录-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 回答