標題:
C語言取反和移位操作的陷阱
[打印本頁]
作者:
wqwtc
時間:
2019-4-10 13:10
標題:
C語言取反和移位操作的陷阱
uint8_t port = 0x5a ;
uint8_t result_8 ;
result_8 = (~port) > > 4 ;
result_8 = ?
我們期望的結果是resuIt_8=0x0a。然而,由于整型的位擴充原則,在16位編譯器中,~port的值是Oxffa5;在32位編譯器中,~pott的值是Oxffffffa5。無論哪種情況,最后結果(右移4位后 賦值給result_8的時候有一個截斷操作)都是resuIt_8=Oxfa,而非預期的result_8=Ox0a。 倘若將最后一行代碼改成result一8=((uin8_t)(~port))>>4,則result_8可取得預期的值. 注意一點: 邏輯操作符不遵循上述“平衡”原則。此外左移(<<)和右移(>>)運算符也不遵循“平衡”原則.
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1