我在 IDA 中打开了一个 64 位 DLL 文件。一个函数有这个伪代码:
unsigned __int64 output;
ULONG input;
output = (unsigned __int64)(input * (unsigned __int128)0xE38E38E38E38E38Fui64 >> 64) >> 5;
这是等效的装配视图:
mov rcx, r13
mov [rsp+56], rcx
mov edx, [rsp+152]
mov rax, 0E38E38E38E38E38Fh
mul rdx
mov r8, rdx
shr r8, 5
mov [r15], r8d
cmp r8d, esi
cmova r8d, ebx
当我想在 MSVC++ 中编译相同的代码时,它显示:
warning C4293: '>>': shift count negative or too big, undefined behavior
我的问题是,这个长常量值有什么作用?这个位移有什么神秘之处吗?