作者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/cn.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