我正在编写一些代码并发现此问题。我很好奇为什么会这样。
代码如下:
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。这个问题的根本原因是什么?
答案 0 :(得分:6)
首先,左移否定值会在C ++ 11中产生未定义的行为,尽管C ++ 03(以及之前)没有明确说明。
其次,不允许您将任何值移位其全部位宽或更多。这也是未定义的行为。这正是您正在做的事情:您正在将int
值移动int
类型的位宽(假设您的平台上CHAR_BIT
为8
)。< / p>
示例中移位计数器的允许值范围为0
到sizeof(int) * CHAR_BIT - 1
。你冒险走出允许的范围。
结果的差异可能是由于第一个值是在运行时计算的,第二个值是在编译时计算的。这些计算算法对您的输入的工作方式不同,这就是结果不同的原因。这没关系,因为行为未定义。