Dlaczego taki złożony kod jest emitowany do dzielenia liczby całkowitej przez moc dwójki?

Kiedy kompiluję ten kod za pomocą VC ++ 10:

DWORD ran = rand();
return ran / 4096;

Dostaję ten demontaż:

299: {
300:    DWORD ran = rand();
  00403940  call        dword ptr [__imp__rand (4050C0h)]  
301:    return ran / 4096;
  00403946  shr         eax,0Ch  
302: }
  00403949  ret

który jest czysty i zwięzły i zastąpił podział mocą dwójki z logicznym przesunięciem w prawo.

Jednak gdy kompiluję ten kod:

int ran = rand();
return ran / 4096;

Dostaję ten demontaż:

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

który wykonuje pewne manipulacje przed wykonaniem właściwego przesunięcia arytmetycznego.

Jaka jest potrzeba tych dodatkowych manipulacji? Dlaczego przesunięcie arytmetyczne nie wystarcza?

questionAnswers(3)

yourAnswerToTheQuestion