Quand je compile ce code avec VC++10:
DWORD ran = rand();
return ran / 4096;
Je reçois ce démontage:
299: {
300: DWORD ran = rand();
00403940 call dword ptr [__imp__rand (4050C0h)]
301: return ran / 4096;
00403946 shr eax,0Ch
302: }
00403949 ret
qui est propre et concis et remplacé une division par une puissance de deux, avec une logique de décalage à droite.
Pourtant, quand je compile ce code:
int ran = rand();
return ran / 4096;
Je reçois ce démontage:
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
qui effectue quelques manipulations avant de faire un droit de décalage.
Quel est le besoin pour ces manipulations? Pourquoi un décalage pas assez?