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++ 中会发生什么情况。
移位操作仅定义为宽度小于整型宽度。因此,您的程序调用未定义的行为,并且输出毫无意义。