負操作數上下文中的左移操作和未定義行為
在C 中,當左側操作數為負數時,左移操作會呼叫未定義的行為。根據 ISO C99,僅針對非負符號運算元明確定義了行為。這是由於表示空出的位元時可能存在歧義。
C 差異
與 C 不同,C 定義了負運算元的左移運算的行為。 C -03 指定結果是左操作數左移指定位數的位元模式,空出的位元以零填滿。此外,如果左操作數是無符號的,則結果是操作數乘以 2 的移位計數次方,並根據類型對某個常數取模進行減少。
未定義行為的原因在 C 中
C 中的未定義行為源於如何處理空出位的問題。在左移操作的情況下,空出的位元可以用 1 或 0 填充,但行為應該一致。例如,在表達式-1<<中, 2、空出的位元如果用 1 填充,則結果為 -4,但如果用 0 填充,則結果為 4026531840。
右移運算複雜度
另一方面,帶有負操作數的右移運算只是實現定義的,而不是未定義的。這是因為空出的位元被移出的位元填充。在二進制補碼表示中,符號位元被移出,它只是確定結果是正還是負。此實作可以靈活地決定是否用零或符號位填充空出的位,從而使行為由實現定義。
以上是為什麼左移負數在 C 中是未定義的行為,但在 C 中是定義的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!