当我使用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
在进行右算术移位之前执行一些操作。
为什么需要这些额外的操作?为什么算术移位不够?