读书人

lt;lt;演算的规则是什么

发布时间: 2014-01-01 18:12:08 作者: rapoo

<<运算的规则是什么
int y = 1 << 32;
y是0

int x = 32;
int y = 1 << x;
y是1
[解决办法]
1 << 32 是常量,编译时1和32都被当成int,编译时就被计算成为0了。
1 << x无法在编译前确定,是被采用指令shl reg cl来执行的,但是intel的汇编对shl有规定的。

引用
The SAL and SHL instructions perform the same operation (see Figure 7-6). They shift the source operand left by
from 1 to 31 bit positions.

所以当移位超过31位后,结果可能会是未知的。
[解决办法]
引用:
int y = 1 << 32;
y是0

int x = 32;
int y = 1 << x;
y是1

如果考虑常量替换(常量代换)优化,二者极有可能相同,结果是。。。。。0
比如
VC Release 版,二者结果都是。。。。。0
VC Debug 版,结果1 << 32是。。。。。0,1 << x 就是SAL and SHL指令的结果。

[解决办法]
超过32位时,结果是取决于编译器+cpu的,不要结果做任何假设。

读书人网 >C语言

热点推荐