按位移位中未定義與實現定義的行為
按位左移運算符(
C 的未定義行為
根據 ISO C99,左移 a負操作數會導致未定義的行為。這是因為標準規定結果應該是左操作數和 2E2 的乘積,結果對結果類型的範圍取模。然而,當左操作數為負數時,這樣的計算可能會導致在有符號類型上下文中出現未定義的結果。
C 的良好定義行為
與C, C 指定左移無符號運算元會產生預期的數學乘法。但是,對於有符號類型,如果結果超出結果類型的可表示範圍,C 也會定義未定義的行為。因此,在 C 中,左移負操作數仍然未定義。
發散的原因
C 採取不同方法的原因可能源於以下事實:由於潛在的溢出,負面行為已經未定義。將定義擴展為涵蓋所有負數情況簡化了標準並澄清了未定義的行為。
實現定義的右移行為
右移負操作數是實現-在C 和C 中都有定義,因為它可能涉及符號擴展和零填充之間的選擇。符號擴展保留空出位元中的原始符號位,而零填充則用零替換它們。不同的編譯器和平台可能會選擇任一行為,因此具有實現定義的性質。
總結
在 C 中,無條件左移負運算元會導致未定義的行為。在 C 中,對於有符號類型也未定義此類操作。另一方面,由於符號擴展和零填充之間的選擇,右移負操作數是兩種語言中實現定義的。
以上是C 和 C 中按位移位的未定義行為和實現定義行為有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!