参考自:https://www.cnblogs.com/jthou/articles/713740.html
用64位编译器可以试试下面这段代码:
int main(int argc, char* argv[])
{
int i, j;
i = 0x0FFF;
j = i>>32;
return 0;
}
你会发现 j 仍然等于0x0FFF,而不是期望中的0。
在编译的时候,编译器会提示(在vc6和gcc4中都一样):“shift count is too large”,或者“right shift count >= width of type”(x86-64)。
在这个程序中到底发生了什么事情呢?我们来看一看这段代码的汇编代码(Debug):
mov WORD PTR [ebp-8], 4095 ;11.3
$LN3:

当使用编译器进行整数右移32位操作时,如int或uint,编译器可能会给出警告,因为位移数超过了类型宽度。在64位编译器中,无论是Debug还是Release模式,i>>32通常等于i本身,而未执行实际的右移。C99标准规定,右移操作数过大时,行为未定义。不同平台和编译器可能有不同的处理方式,例如riscv64和arm32的结果可能不同。建议使用保守的表达式避免这种情况。
最低0.47元/天 解锁文章
1785

被折叠的 条评论
为什么被折叠?



