このコードをVC++10でコンパイルすると、次のようになります。
DWORD ran = rand();
return ran / 4096;
私はこの分解を取得します:
299: {
300: DWORD ran = rand();
00403940 call dword ptr [__imp__rand (4050C0h)]
301: return ran / 4096;
00403946 shr eax,0Ch
302: }
00403949 ret
これはクリーンで簡潔であり、論理的な右シフトで除算を2の累乗に置き換えました。
しかし、私がこのコードをコンパイルすると、次のようになります。
int ran = rand();
return ran / 4096;
私はこの分解を取得します:
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
右算術シフトを実行する前に、いくつかの操作を実行します。
それらの余分な操作の必要性は何ですか?算術シフトでは不十分なのはなぜですか?