首頁 >後端開發 >C++ >為什麼左移負數在 C 中是未定義的行為,但在 C 中是定義的?

為什麼左移負數在 C 中是未定義的行為,但在 C 中是定義的?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-11 10:14:11475瀏覽

Why is Left Shifting a Negative Number Undefined Behavior in C but Defined in C  ?

負操作數上下文中的左移操作和未定義行為

在C 中,當左側操作數為負數時,左移操作會呼叫未定義的行為。根據 ISO C99,僅針對非負符號運算元明確定義了行為。這是由於表示空出的位元時可能存在歧義。

C 差異

與 C 不同,C 定義了負運算元的左移運算的行為。 C -03 指定結果是左操作數左移指定位數的位元模式,空出的位元以零填滿。此外,如果左操作數是無符號的,則結果是操作數乘以 2 的移位計數次方,並根據類型對某個常數取模進行減少。

未定義行為的原因在 C 中

C 中的未定義行為源於如何處理空出位的問題。在左移操作的情況下,空出的位元可以用 1 或 0 填充,但行為應該一致。例如,在表達式-1<<中, 2、空出的位元如果用 1 填充,則結果為 -4,但如果用 0 填充,則結果為 4026531840。

右移運算複雜度

另一方面,帶有負操作數的右移運算只是實現定義的,而不是未定義的。這是因為空出的位元被移出的位元填充。在二進制補碼表示中,符號位元被移出,它只是確定結果是正還是負。此實作可以靈活地決定是否用零或符號位填充空出的位,從而使行為由實現定義。

以上是為什麼左移負數在 C 中是未定義的行為,但在 C 中是定義的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn