int value = 0xffffffff;
int len = 32;
int result = value << len; // result will be 0xffffffff
result = value << 32; // result will be 0x0
为什么会有所不同?
编辑: 对不起,我弄错了。在上面的例子中,两个结果都是 0xffffffff。 所以看看这个:
unsigned int value = 0xffffffff;
unsigned int len = 32;
printf("0x%x\n", value << len); //will print 0xffffffff
printf("0x%x\n", 0xffffffff << 32); //will print 0x0
最佳答案
如果 int
的大小为 32 位或更少,则您的代码包含
未定义的行为。位数
shifted 必须大于或等于 0,并且严格小于
正在移动的位数。
实践中可能发生的情况是,对于变量,
编译器可能只是将它传递给机器
只考虑 5 个低位的指令(它们是
0 在 32 的情况下);当移位计数为常数时,
编译器在内部评估表达式,可能在 long
long
,然后截断它。但这只是一种可能
行为;就语言而言,任何事情都可能发生
担心的。
关于C++:按变量值而不是数字移位 ->有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22809618/