2016-03-05 38 views
-1
int main() { 

    int n = 32; 
    cout << (-1 << n) << ' ' << (-1 << 32); 
} 

我使用Viusal Studio的2013和输出两个左移操作得到了不同的答案

-1 0 

为什么我得到了两个操作不同的结果,即使我32移相同数量在这两种情况下?

+0

好的,他们得到了不同的答案。你的问题是什么? –

+0

@NickyC难道不明显吗?他们看起来应该给出同样的答案。 –

+0

@SchighSchagh这是要求一个明确的问题陈述,这可能会改善问题,而当时并不存在。此外,有些人可能不认识这个明显的问题,因为未定义的行为对他们来说可能太明显,不成为一个问题。 –

回答

2

如果选中编译期间的警告,您可以:

warning: left shift count >= width of type [enabled by default] 
cout << (-1 << n) << " " << (-1 << 32); 

在第一种情况下,n,编译器不知道的n在编译时的价值,但它确实为32


根据该文档:

移位操作的结果是不确定的,如果添加剂的表达是阴性或者如果添加剂的表达大于或等于在所述的位的数目(提升)换档表现。如果加法表达式为0,则不执行移位操作。

如果左移有符号数以便符号位受到影响,则结果是未定义的。以下示例显示了在将1位左移到符号位位置时Visual C++中发生的情况。

+0

我的不好。谢谢。 – Derlin

+0

我明白了。谢谢! – zhh

+0

不客气。不要忘记将帖子标记为左侧的复选标记。快乐的编码! – Derlin

2

移位操作只能定义为宽度小于整数类型的宽度。因此你的程序调用未定义的行为,输出没有意义。

相关问题