Cuando compilar este código con VC++ 10:¿Por qué se emite este código complejo para dividir un entero con signo por una potencia de dos?
DWORD ran = rand();
return ran/4096;
consigo este desmontaje:
299: {
300: DWORD ran = rand();
00403940 call dword ptr [__imp__rand (4050C0h)]
301: return ran/4096;
00403946 shr eax,0Ch
302: }
00403949 ret
que está limpio y conciso y sustituye una división por potencias de dos, con un derecho lógica cambio.
Sin embargo, cuando puedo compilar este código:
int ran = rand();
return ran/4096;
consigo este desmontaje:
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
que realiza algunas manipulaciones antes de realizar un desplazamiento aritmético a la derecha.
¿Cuál es la necesidad de esas manipulaciones adicionales? ¿Por qué un cambio aritmético no es suficiente?
FWIW, en C89 y C++ 03 se definió por implementación de qué manera las divisiones de división entera para los operandos negativos. En C99 y C++ 11 no lo es. –
¿Tantas votaciones ascendentes para eso? –
@AlexeyFrunze Este es realmente bastante bueno en comparación con algunas de las otras cosas que se suben masivamente. Entonces no lo veo como inmerecido. – Mysticial