[問題] logic shift 操作,結果與預期不同

看板C_and_CPP作者 (機機勳)時間8年前 (2017/05/17 11:42), 編輯推噓3(308)
留言11則, 4人參與, 最新討論串1/1
開發平台(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

05/17 11:57, , 1F
undefined behavior
05/17 11:57, 1F

05/17 11:59, , 2F

05/17 12:16, , 3F
改成 (uint32_t)0xFFFFFFFF
05/17 12:16, 3F

05/18 02:47, , 4F
這裡還有一個 UB 是移了 32 位
05/18 02:47, 4F

05/18 02:47, , 5F
對一個無號數左移大於等於其 bit 數的數目是 UB
05/18 02:47, 5F

05/18 02:48, , 6F
前一個由於移動數目是變數所以可能使用底層的左移機器指令
05/18 02:48, 6F

05/18 02:52, , 7F
然後如果我沒記錯的話, 32-bit 的左移是只看左移量尾 5 位
05/18 02:52, 7F

05/18 02:56, , 8F
但 << 32 可能會由編譯器做掉了, 所以才會給你 0 的結果
05/18 02:56, 8F

05/18 02:57, , 9F
標準在這裡是 UB, 也就是它不規定這會發生什麼事
05/18 02:57, 9F

05/18 02:57, , 10F
所以才會兩個看似都 32 位但結果卻不同
05/18 02:57, 10F

05/19 02:00, , 11F
原來是編譯器做掉了!學習了
05/19 02:00, 11F
文章代碼(AID): #1P6yQC-5 (C_and_CPP)