shift -1到sizeof(int)在C ++中生成两个不同的结果

时间:2014-09-26 04:28:44

标签: c++ bit-shift

我正在编写一些代码并发现此问题。我很好奇为什么会这样。

代码如下:

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。这个问题的根本原因是什么?

1 个答案:

答案 0 :(得分:6)

首先,左移否定值会在C ++ 11中产生未定义的行为,尽管C ++ 03(以及之前)没有明确说明。

其次,不允许您将任何值移位其全部位宽或更多。这也是未定义的行为。这正是您正在做的事情:您正在将int值移动int类型的位宽(假设您的平台上CHAR_BIT8)。< / p>

示例中移位计数器的允许值范围为0sizeof(int) * CHAR_BIT - 1。你冒险走出允许的范围。

结果的差异可能是由于第一个值是在运行时计算的,第二个值是在编译时计算的。这些计算算法对您的输入的工作方式不同,这就是结果不同的原因。这没关系,因为行为未定义。