在GCC轉移的整數,下面的代碼總是返回<<
如果num1s == 0
的左操作數:留下的32位
0xFFFFFFFFu << (32-num1s);
閱讀Why doesn't left bit-shift, "<<", for 32-bit integers work as expected when used more than 32 times?後,由大衛·赫弗南引用的標準,似乎如果左操作數是無符號,它是一個已定義的操作。只有當E1(左操作數)具有帶符號的類型和非負值時纔會導致未定義的行爲。
任何人都可以解釋,如果標準明確規定,如果移位量大於該類型包含的位數,它是未定義的行爲?
「如果右操作數爲負數,或者大於或等於升級的左操作數的位長度,則行爲未定義。」但嚴重的是,讓自己獲得一份標準副本,這些問題對你自己來說是微不足道的。 –
爲什麼它會是一個未定義的行爲?它是非常明確的,操作會產生一個'0'。 – YePhIcK
@YePhIcK純粹是因爲它被定義爲是未定義的。 –