[英]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
。
想想當result
是255
(即0xff
)時會發生什么。 將其向左移四位將使其為4080
(或0xff0
)。 編譯器如何能夠將該值重新壓縮到result
? 它不能,所以它只是將其截斷為240
( 0xf0
)。 換句話說,可以改變整數運算result << 4
的值。
所有算術和邏輯運算符都對其參數執行“整體提升”。 整數提升將小於int
類型(如unsigned char
)轉換為int
或unsigned int
。 你會看到同樣的事情,如果你更換<<
與+
。
哦,不需要括號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.