為什麼這兩個位運算操作結果會不同?
01-05
因為這是一個比較少見的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 語言編譯器前端的難度如何?