警告:左移计数> =类型的宽度

Rup*_*ott 54 c bit-manipulation bit-shift long-integer

我很擅长处理比特,并且在编译时遇到以下警告:

 7: warning: left shift count >= width of type
Run Code Online (Sandbox Code Playgroud)

我的第7行看起来像这样

unsigned long int x = 1 << 32;
Run Code Online (Sandbox Code Playgroud)

如果long我的系统的大小是32位,这将是有意义的.但是,sizeof(long)返回8CHAR_BIT定义为8建议long应为8x8 = 64位长.

我在这里错过了什么?是sizeofCHAR_BIT不准确还是我误解了一些基本的东西?

Jam*_*lis 78

long可能是64位类型,但1仍然是int.你需要做1一个long int使用L后缀:

unsigned long x = 1UL << 32;
Run Code Online (Sandbox Code Playgroud)

(你也应该unsigned使用U我所示的后缀,以避免左移有符号整数的问题.当a long为64位宽并且你移位32位时没有问题,但如果你使用它会有问题移位63位)

  • @whjm:我刚才提到了C99标准,发现如下:_E1 << E2的结果是E1左移E2位的位置; 腾出的位用零填充.**如果E1具有无符号类型**,则结果的值为E1×2\*\*E2,比结果类型中可表示的最大值减少一个模数.**如果E1具有带符号类型和非负值,并且E1×2\*\*E2可在结果类型**中表示,那么这就是结果值;**否则,行为未定义**._ (3认同)

小智 16

unsigned long是32位还是64位,具体取决于您的系统.unsigned long long总是64位.你应该这样做:

unsigned long long x = 1ULL << 32
Run Code Online (Sandbox Code Playgroud)

  • IOW,给你带来问题的是常数 1 的大小,而不是 x。 (2认同)