為什麼這兩個位運算操作結果會不同?


因為這是一個比較少見的UB。

C11 6.5.7 Bitwise shift operators

TL;DR:如果(位移操作的)右操作數是負數或大於等於整形提升過的左操作數的位寬,則行為未定義

而且從圖上來看,編譯器應該警告過你了。

---------------- 分割線 ----------------

至於這裡為什麼UB會導致不同,因為既然是UB所以編譯器也可以隨便亂搞。前者可能是因為編譯器常量摺疊時按照 3 / (2 ^ 32) 計算了,結果是0;後者是因為x86的位移指令是加了mask的,所以結果是1:

反正怎麼亂搞都行(


移位數大於等於左操作數bit數是ub


這這也太大了吧,超過int範圍了,你換用long long類型試一下


你要研究literal 3 在右移運算中究竟是什麼類型。


推薦閱讀:

C++模版元編程中如何拼接兩個const char*?
windows有沒有類似xcode的軟體,寫完代碼可以run一下?
已經邁入30的程序員,還能幹幾年,以後該怎麼辦呢?
C語言兩數定義正確,相乘溢出的原因?
做 C 語言編譯器前端的難度如何?

TAG:編程 | CC | 編譯器 |