作者OoShiunoO (機機勳)
看板C_and_CPP
標題[問題] logic shift 操作,結果與預期不同
時間Wed May 17 11:42:01 2017
開發平台(Platform): (Ex: Win10, Linux, ...)
win7
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC c99
問題(Question):
我想做個邏輯位移,但結果怪怪的
預期的正確結果(Expected Output):
0x00000000
錯誤結果(Wrong Output):
0xFFFFFFFF
程式碼(Code):(請善用置底文網頁, 記得排版)
比如說:
int left = 32;
printf("0x%08X\n", 0xffffffff << left);
這樣會print出 0xFFFFFFFF
但是若我換成
printf("0x%08X\n", 0xffffffff << 32);
則會print出 0x00000000
why??
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.168.148.138
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1494992524.A.F85.html
1F:→ aiwhat: undefined behavior 05/17 11:57
3F:推 Hazukashiine: 改成 (uint32_t)0xFFFFFFFF 05/17 12:16
4F:推 LPH66: 這裡還有一個 UB 是移了 32 位 05/18 02:47
5F:→ LPH66: 對一個無號數左移大於等於其 bit 數的數目是 UB 05/18 02:47
6F:→ LPH66: 前一個由於移動數目是變數所以可能使用底層的左移機器指令 05/18 02:48
7F:→ LPH66: 然後如果我沒記錯的話, 32-bit 的左移是只看左移量尾 5 位 05/18 02:52
8F:→ LPH66: 但 << 32 可能會由編譯器做掉了, 所以才會給你 0 的結果 05/18 02:56
9F:→ LPH66: 標準在這裡是 UB, 也就是它不規定這會發生什麼事 05/18 02:57
10F:→ LPH66: 所以才會兩個看似都 32 位但結果卻不同 05/18 02:57
11F:推 chuegou: 原來是編譯器做掉了!學習了 05/19 02:00