2014-03-28 63 views
2

有人能解釋我爲什麼:爲什麼組合uint8_t的兩個班次會產生不同的結果?

x = x << 1; 
x = x >> 1; 

和:

x = (x << 1) >> 1; 

生產用C不同的答案? x是* uint8_t *類型(無符號的1字節長整數)。例如,當我在第一種情況下通過128 (10000000)時,它將返回0(如預期的最重要的位掉出),但在第二種情況下,它將返回原始的128。這是爲什麼?我希望這些表達式是相等的?

回答

12

這是由於整數的促銷活動,在這兩種情況下,按位轉換的兩個操作數都將被提升爲int。在第二種情況下:

x = (x << 1) >> 1; 

x << 1的結果將是一個INT,因此移位的位將被保留並提供給下一步驟爲INT這將再次移動它。在第一種情況:

x = x << 1; 
x = x >> 1; 

當你將回到x你就失去了額外的比特。從draft C99 standard部分6.5.7 Bit-wise shift operators它說:

整數升級是在每個操作數上執行。

整數優惠在部分覆蓋6.3.1.1布爾,字符,和整數段落它說:

如果int可以表示原始類型的所有值,該值是轉換爲int; 否則,它被轉換爲一個unsigned int。這些被稱爲整數 促銷。 48)

的最後一塊這個爲什麼從INT256uint8_t轉換給我們0?該轉換是覆蓋在部分6.3.1.3符號和無符號整數其是下換算部並說:

否則,如果新類型是無符號的,所述值是通過反覆增加或 減去一個轉換超過新型 中可表示的最大值,直到該值處於新類型的範圍內。 49)

因此,我們必須256 - (255+1)這是0

6

當你的bitshift結果被提升爲int。在第一個示例中,您每次都將int轉換回uint8_t,並丟失中間數據。但在第二個例子中,當你轉回時保持int結果。

相關問題