65

我对处理位非常陌生,并且在编译时遇到了以下警告:

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

我的第 7 行看起来像这样

unsigned long int x = 1 << 32;

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

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

4

6 回答 6

103

long可能是 64 位类型,但1仍然是int. 您需要使用后缀制作1a :long intL

unsigned long x = 1UL << 32;

(你也应该unsigned使用U我展示的后缀来避免左移有符号整数的问题。当 along是 64 位宽并且你移动 32 位时没有问题,但如果你移位 63 位)

于 2010-11-17T03:49:56.357 回答
18

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

unsigned long long x = 1ULL << 32
于 2012-08-11T01:15:26.650 回答
2

公认的解决方案适用于 [constant]ULL<<32,但不适用于现有变量 - 例如 [variable]<<32。变量的完整解决方案是:((unsigned long long)[variable]<<32)。旁白:我个人对这个警告的看法是,它首先是完全没有必要的。编译器可以看到接收数据类型是什么,并从标题或常量值中的定义中知道参数的宽度。我相信苹果可以让 clang 编译器比它在这个警告方面更智能一些。

于 2019-07-10T10:26:05.363 回答
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 )

于 2012-03-29T13:07:09.393 回答
1

无符号长 x = 1UL << 31;

不显示错误信息。因为之前你指定了32,是不正确的,因为只限于0-31。

于 2010-11-18T10:22:44.453 回答
-2

你可以使用类似的东西:

unsigned long x = 1;
x = x << 32;
于 2014-03-10T09:14:33.907 回答