Quando compilo questo codice con VC++ 10:Perché un codice così complesso viene emesso per dividere un numero intero con un potere di due?
DWORD ran = rand();
return ran/4096;
ottengo questo smontaggio:
299: {
300: DWORD ran = rand();
00403940 call dword ptr [__imp__rand (4050C0h)]
301: return ran/4096;
00403946 shr eax,0Ch
302: }
00403949 ret
che è pulito e conciso e sostituito una divisione per una potenza di due, con un giusto logico cambio.
Eppure, quando ho compilare il codice:
int ran = rand();
return ran/4096;
ottengo questo lo smontaggio:
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
che esegue alcune manipolazioni prima di fare uno spostamento aritmetico a destra.
Qual è la necessità di quelle manipolazioni extra? Perché uno spostamento aritmetico non è abbastanza?
FWIW, in C89 e C++ 03 è stato definito dall'implementazione in quale modo interi round di divisione per operandi negativi. In C99 e C++ 11 non lo è. –
Così tanti upvotes per quello? –
@AlexeyFrunze Questo è in realtà piuttosto buono rispetto ad alcune delle altre cose che vengono ingrandite in maniera massiccia. Quindi non lo vedo come immeritato. – Mysticial