[问题] 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