我很擅长处理比特,并在编译时遇到以下警告:
7: warning: left shift count >= width of type
我的第7行看起来像这样
unsigned long int x = 1 << 32;
如果我系统上long
的大小是32位,那么这是有意义的。但是,sizeof(long)
返回8
,CHAR_BIT
定义为8
,表示长度应为8x8 = 64位长。
我在这里缺少什么? sizeof
和CHAR_BIT
是不准确的还是我误解了一些基本的东西?
答案 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;