[英]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.