這裡有個隱式型別轉換先簡單說一下,然後再來修改完善,如有不對歡迎指出,謝謝。大體就是,C語言中,宏定義在預處理階段是直接替換的,也就是直接用7來替換size,7是int型別。當表示式中有int型別的時候,運算元unsigned int會被自動隱式轉換為int型別,(一般是低精度轉換為高精度)也就是這裡的分開的a和t都會轉化為int型別,但是,這裡a在下一行程式碼中又透過賦值語句,把a賦值給本身的unsigned int型別了。也就是又把a的值從int型別轉換回unsigned int型別了。但是t卻並沒有這樣做。背景:無符號型別的整數在做右移位運算時,左邊高位預設補0,右邊的低位捨棄,也就是這裡的a,初始值為0000 0001當這個數向左移7位,右側低位補0,也就是變成了1000 000016進位制也就是80然後按位取反,0111 111116進位制也就是7f然後再右移7位,高位補0,也就是變成了0000 0000再來說t。當預處理時,會把size用7來替換,這裡的7,編譯器預設認為是int型別的(這點我不太敢確認,需要翻書),當t執行完向左移7位後,和a一樣,變成,表示式t<<7,的值變為,1000 0000然後按位取反,得到0111 1111也就是7f然後再右移7位,按照前面說的,因為已經把表示式的值轉換為int型別,所以,對於有符號的int型別做右移運算,高位要補符號位1,結果為1111 1110fe待完善。
這裡有個隱式型別轉換先簡單說一下,然後再來修改完善,如有不對歡迎指出,謝謝。大體就是,C語言中,宏定義在預處理階段是直接替換的,也就是直接用7來替換size,7是int型別。當表示式中有int型別的時候,運算元unsigned int會被自動隱式轉換為int型別,(一般是低精度轉換為高精度)也就是這裡的分開的a和t都會轉化為int型別,但是,這裡a在下一行程式碼中又透過賦值語句,把a賦值給本身的unsigned int型別了。也就是又把a的值從int型別轉換回unsigned int型別了。但是t卻並沒有這樣做。背景:無符號型別的整數在做右移位運算時,左邊高位預設補0,右邊的低位捨棄,也就是這裡的a,初始值為0000 0001當這個數向左移7位,右側低位補0,也就是變成了1000 000016進位制也就是80然後按位取反,0111 111116進位制也就是7f然後再右移7位,高位補0,也就是變成了0000 0000再來說t。當預處理時,會把size用7來替換,這裡的7,編譯器預設認為是int型別的(這點我不太敢確認,需要翻書),當t執行完向左移7位後,和a一樣,變成,表示式t<<7,的值變為,1000 0000然後按位取反,得到0111 1111也就是7f然後再右移7位,按照前面說的,因為已經把表示式的值轉換為int型別,所以,對於有符號的int型別做右移運算,高位要補符號位1,結果為1111 1110fe待完善。