int main() {
int n = 32;
cout << (-1 << n) << ' ' << (-1 << 32);
}
我使用的是Viusal Studio 2013,输出是
-1 0
为什么我会为这两个操作得到不同的结果,即使我在两种情况下都将相同的数字移动了32?
答案 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 ++中会发生什么。