当我用 VC++10 编译这段代码时:
DWORD ran = rand();
return ran / 4096;
我得到这个反汇编:
299: {
300: DWORD ran = rand();
00403940 call dword ptr [__imp__rand (4050C0h)]
301: return ran / 4096;
00403946 shr eax,0Ch
302: }
00403949 ret
它简洁明了,并用逻辑右移代替了除以 2 的幂。
然而,当我编译这段代码时:
int ran = rand();
return ran / 4096;
我得到这个反汇编:
299: {
300: int ran = rand();
00403940 call dword ptr [__imp__rand (4050C0h)]
301: return ran / 4096;
00403946 cdq
00403947 and edx,0FFFh
0040394D add eax,edx
0040394F sar eax,0Ch
302: }
00403952 ret
在进行右算术移位之前执行一些操作。
这些额外的操作需要什么?为什么算术移位还不够?