两个左移操作得到了不同的答案

时间:2016-03-05 07:55:44

标签: c++

int main() {

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

我使用的是Viusal Studio 2013,输出是

-1 0

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

2 个答案:

答案 0 :(得分:2)

移位操作仅定义为宽度小于整数类型的宽度。因此,您的程序会调用未定义的行为,输出也毫无意义。

答案 1 :(得分:2)

如果在编译期间检查警告,则会得到:

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

在第一种情况下,n,编译器在编译时不知道n的值,但它对32有效。

根据文件:

  

如果additive-expression为负数或者additive-expression大于或等于(提升的)shift-expression中的位数,则移位操作的结果未定义。无移位如果additive-expression为0,则执行操作。

     

如果左移有符号数字以使符号位受影响,则结果未定义。下面的示例显示当1位左移到符号位位置时,Visual C ++中会发生什么。