[英]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)
返回8
, CHAR_BIT
定义为8
,表示long应为8x8 = 64位长。
我在这里错过了什么? sizeof
和CHAR_BIT
不准确的还是我误解了一些基本的东西?
long
可能是64位类型,但1
仍然是int
。 你需要使用L
后缀使1
为long 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.