簡體   English   中英

按位移位將unsigned char提升為int

[英]bitwise shift promotes unsigned char to int

以下代碼:

unsigned char result;
result = (result << 4 );

使用gcc版本4.6.4(Debian 4.6.4-2)編譯,帶有-Wconversion標志會導致警告

警告:從'int'轉換為'unsigned char'可能會改變其值[-Wconversion]

這是為什么?

因為標准是這樣說的。 二元運算符的操作數進行整數提升,其中小於int任何東西都被提升為int ; 操作的結果也是int類型。 如果原始值是,例如, 0x12 ,則結果將為0x120 ,並將此值分配給unsigned char將導致值的更改。 (指定的值將為0x20 。)從那里發出警告。

編輯:

從標准(§5.8Shift操作符):“操作數應該是整數或無范圍的枚舉類型,並且執行整數提升。結果的類型是提升的左操作數的類型。” 與其他二元運算符不同, 不需要從兩個運算符中找到一個公共類型:結果類型是左操作數的周期類型。 但整體推廣確實仍時有發生:在unsigned char將晉升為int (或unsigned int ,如果int的大小為1)。

因為int值可能大於可以放在unsigned char

想想當result255 (即0xff )時會發生什么。 將其向左移四位將使其為4080 (或0xff0 )。 編譯器如何能夠將該值重新壓縮到result 它不能,所以它只是將其截斷為2400xf0 )。 換句話說,可以改變整數運算result << 4的值。

所有算術和邏輯運算符都對其參數執行“整體提升”。 整數提升將小於int類型(如unsigned char )轉換為intunsigned int 你會看到同樣的事情,如果你更換<<+

哦,不需要括號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM