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

时间:2010-11-17 03:48:23

标签: c bit-manipulation long-integer bit-shift

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

 7: warning: left shift count >= width of type

我的第7行看起来像这样

unsigned long int x = 1 << 32;

如果我系统上long的大小是32位,那么这是有意义的。但是,sizeof(long)返回8CHAR_BIT定义为8,表示长度应为8x8 = 64位长。

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

6 个答案:

答案 0 :(得分:73)

long可能是64位类型,但1仍然是int。您需要使用1后缀long int进行L {/ 1}}。

unsigned long x = 1UL << 32;

(你也应该使用我所示的unsigned后缀U,以避免左移有符号整数的问题。long是没有问题的64位宽,你移位32位,但如果你移位63位,那将是一个问题)

答案 1 :(得分:14)

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

unsigned long long x = 1ULL << 32

答案 2 :(得分:1)

unsigned long x = 1UL&lt;&lt; 31;

不显示错误消息。因为在指定32之前,不是因为仅限于0-31。

答案 3 :(得分:1)

您无法将值移至最大位

int x;         // let int be 4 bytes so max bits : 32 
x <<= 32; 

因此,这会生成警告

left shift count >= width of type (i.e type = int = 32 )

答案 4 :(得分:0)

对于[constant] ULL << 32而言,可接受的解决方案很好,但对于现有变量则没有好处-例如[变量] << 32。变量的完整解决方案是: ((无符号long long)[变量] << 32)。另外:我个人对此警告的看法是,一开始它是完全没有必要的。编译器可以看到什么是接收数据类型,并可以根据标头或常量值中的定义了解参数的宽度。我相信Apple可以使clang编译器比此警告更智能。

答案 5 :(得分:-2)

你可以使用类似的东西:

unsigned long x = 1;
x = x << 32;
相关问题