我正在编写一些代码并发现了这个问题。我很好奇为什么会这样。
代码如下:
int n = sizeof(int)*8;
int mask_two = (-1<<n);
cout<<"1:"<<hex<<mask_two<<endl;
int y = -1<<(sizeof(int)*8);
cout<<"2:"<<hex<<y<<endl;
当我编译这段代码时,输出是:
1:ffffffff
2:0
为什么输出#1 和输出#2 的值不同?编译是Visual C++ 10.0。这个问题的根本原因是什么?
首先,左移负值会在 C++11 中产生未定义的行为,尽管 C++03(及之前的版本)没有明确说明这一点。
其次,不允许将任何 值移动其完整位宽或更多。这也是未定义的行为。而这正是您正在做的:您正在将一个 int
值移动 int
类型的位宽(假设 CHAR_BIT
是 8
在您的平台上)。
您的示例中移位计数器的允许值范围从 0
到 sizeof(int) * CHAR_BIT - 1
。您正在冒险超出允许的范围。
结果的差异可能是由于第一个值是在运行时计算而第二个值是在编译时计算的。这些计算算法对您的输入的处理方式不同,这就是结果不同的原因。这没关系,因为无论如何行为都是未定义的。