Hello!
On Thu, Jan 31, 2013 at 12:51 AM, azure wang wrote:
> bit.rshfit(19,32)结果是19
>
这是因为 LuaJIT 2.0 的 bitop 模块只支持 32 位整数,所以超出值长度的移位运算的结果是“未定义的”。
根据 LuaJIT 2.0 源码树中 src/vm_x86.dasc 文件里针对 bit.rshift 的汇编实现,在 x86 和
x86_64 体系结构上,bit.rshift(19, 32) 等价于下面这样的机器指令序列:
mov ebp, 19
mov cl, 32
shr ebp, cl
对于 x86/x86_64 体系结构的 CPU 而言,当对 32 位操作数进行右移运算时,a >> b 等价于 a >> (b % 32).
于是 19 >> 32 等价于 19 >> 0,结果自然还是 19. 其他种类的 CPU 可能会得到不同的结果。
Best regards,
-agentzh