看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1494992524.A.F85.html
aiwhat: undefined behavior 05/17 11:57
Hazukashiine: 改成 (uint32_t)0xFFFFFFFF 05/17 12:16
LPH66: 這裡還有一個 UB 是移了 32 位 05/18 02:47
LPH66: 對一個無號數左移大於等於其 bit 數的數目是 UB 05/18 02:47
LPH66: 前一個由於移動數目是變數所以可能使用底層的左移機器指令 05/18 02:48
LPH66: 然後如果我沒記錯的話, 32-bit 的左移是只看左移量尾 5 位 05/18 02:52
LPH66: 但 << 32 可能會由編譯器做掉了, 所以才會給你 0 的結果 05/18 02:56
LPH66: 標準在這裡是 UB, 也就是它不規定這會發生什麼事 05/18 02:57
LPH66: 所以才會兩個看似都 32 位但結果卻不同 05/18 02:57
chuegou: 原來是編譯器做掉了!學習了 05/19 02:00