繁体   English   中英

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

[英]warning: left shift count >= width of type

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

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

我的第7行看起来像这样

unsigned long int x = 1 << 32;

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

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

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

unsigned long x = 1UL << 32;

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

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

unsigned long long x = 1ULL << 32

unsigned long x = 1UL << 31;

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

您不能将值移动到其最大位

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

所以,这会产生警告

left shift count >= width of type (ie type = int = 32 )

接受的解决方案适用于[常量] ULL << 32但对现有变量没有好处 - 例如[变量] << 32。 变量的完整解决方案是:((unsigned long long)[variable] << 32)。 旁白:我个人对此警告的看法是,首先完全没有必要。 编译器可以查看接收数据类型是什么,并从头部或常量值中的定义中了解参数的宽度。 我相信Apple可以使clang编译器比这个警告更加智能。

你可以使用这样的东西:

unsigned long x = 1;
x = x << 32;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM