Kiedy mogę skompilować ten kod z VC++ 10:Dlaczego taki złożony kod jest emitowany do dzielenia liczby całkowitej ze znakiem przez potęgę dwóch?
DWORD ran = rand();
return ran/4096;
otrzymuję 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ąpione przez podział mocy dwa z logicznym prawo przesunięcie.
Jednak kiedy mogę skompilować ten kod:
int ran = rand();
return ran/4096;
otrzymuję 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ściwej arytmetyczne przesunięcie.
Jakie są dodatkowe manipulacje? Dlaczego przesunięcie arytmetyczne nie jest wystarczające?
FWIW, w C89 i C++ 03 była to implementacja zdefiniowana w ten sposób, w jaki sposób liczby całkowite zaokrąglane są dla ujemnych argumentów. W C99 i C++ 11 tak nie jest. –
Tyle zdjęć na ten temat? –
@AlexeyFrunze Ten jest całkiem niezły w porównaniu do innych rzeczy, które zostały bardzo mocno upowszechnione. Nie uważam tego za niezasłużoną. – Mysticial