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

作者: OoShiunoO (機機勳)   2017-05-17 11:42:01
開發平台(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??
作者: aiwhat   2017-05-17 11:57:00
作者: Hazukashiine (私は幸せです)   2017-05-17 12:16:00
改成 (uint32_t)0xFFFFFFFF
作者: LPH66 (-6.2598534e+18f)   2017-05-18 02:47:00
這裡還有一個 UB 是移了 32 位對一個無號數左移大於等於其 bit 數的數目是 UB前一個由於移動數目是變數所以可能使用底層的左移機器指令然後如果我沒記錯的話, 32-bit 的左移是只看左移量尾 5 位但 << 32 可能會由編譯器做掉了, 所以才會給你 0 的結果標準在這裡是 UB, 也就是它不規定這會發生什麼事所以才會兩個看似都 32 位但結果卻不同
作者: chuegou (chuegou)   2017-05-19 02:00:00
原來是編譯器做掉了!學習了

Links booklink

Contact Us: admin [ a t ] ucptt.com