为什么没有留下位移<<在long int数据类型中移位超过31?

Jua*_*ews 8 c++ bit-shift

我想在我的程序中使用以下代码,但是gcc不允许我将我的1转移到31以上.

sizeof(long int) 显示8,所以这并不意味着我可以离开直到63?

#include <iostream>

using namespace std;

int main(){
    long int x;
    x=(~0 & ~(1<<63));
    cout<<x<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译输出以下警告:

left shift `count >= width` of type [enabled by default] `x=(~0 & ~(1<<63))`;
                                                                    ^
Run Code Online (Sandbox Code Playgroud)

输出为-1.如果我离开31位,我得到2147483647正如预期的那样.

我希望除了MSB之外的所有位都打开,从而显示数据类型可以容纳的最大值.

Luc*_*ore 7

虽然你x的类型long int,但1不是.1是一个int,所以1<<63确实是未定义的.

尝试(static_cast<long int>(1) << 63),或1L << 63按照Wojtek的建议.

  • 为什么不是'1L`而不是演员呢? (7认同)
  • 如果`long`是64-btw(整数溢出),这仍然是未定义的行为. (2认同)