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


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

我正在使用Viusal Studio 2013,输出是

-1 0

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

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

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

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

<小时 />

根据文档:

如果加法表达式为负数,或者加法表达式大于或等于(提升的)移位表达式中的位数,则移位运算的结果未定义。如果加法表达式为 0,则不执行移位操作。

如果左移有符号

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

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

相关内容

最新更新