有人能解釋我爲什麼:爲什麼組合uint8_t的兩個班次會產生不同的結果?
x = x << 1;
x = x >> 1;
和:
x = (x << 1) >> 1;
生產用C不同的答案? x
是* uint8_t *類型(無符號的1字節長整數)。例如,當我在第一種情況下通過128 (10000000)
時,它將返回0
(如預期的最重要的位掉出),但在第二種情況下,它將返回原始的128
。這是爲什麼?我希望這些表達式是相等的?
有人能解釋我爲什麼:爲什麼組合uint8_t的兩個班次會產生不同的結果?
x = x << 1;
x = x >> 1;
和:
x = (x << 1) >> 1;
生產用C不同的答案? x
是* uint8_t *類型(無符號的1字節長整數)。例如,當我在第一種情況下通過128 (10000000)
時,它將返回0
(如預期的最重要的位掉出),但在第二種情況下,它將返回原始的128
。這是爲什麼?我希望這些表達式是相等的?
這是由於整數的促銷活動,在這兩種情況下,按位轉換的兩個操作數都將被提升爲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)
的最後一塊這個爲什麼從INT值256
到uint8_t轉換給我們0
?該轉換是覆蓋在部分6.3.1.3
符號和無符號整數其是下換算部並說:
否則,如果新類型是無符號的,所述值是通過反覆增加或 減去一個轉換超過新型 中可表示的最大值,直到該值處於新類型的範圍內。 49)
因此,我們必須256 - (255+1)
這是0
。
當你的bitshift結果被提升爲int
。在第一個示例中,您每次都將int轉換回uint8_t,並丟失中間數據。但在第二個例子中,當你轉回時保持int結果。