簡體   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