割り算 VS 右シフト その2
この記事は割り算 VS 右シフトの続きです。
実行環境、検証方法などは、割り算 VS 右シフトを参照してください。
割り算 vs 右シフト(割る2 符号なし)
符号付き整数の除算を行う場合、割り算と右シフトでは、右シフトのほうが若干実行速度が速くなることが分かった。これは割り算と右シフトでは、負の数の小数点以下の丸め方が異なるからであった。では符号なし整数の除算を行う場合は、どのようになるだろうか?
そこで、ソースを修正し、変数valの宣言時にunsignedキーワードを追加した。コンパイルを行い、アセンブラソースを入手したところ、2種類のC言語プログラムのアセンブラソースは全く同じになった。入手したアセンブラソースの一部は以下の通り。
1 .file "div2.c" 2 .section .rodata 3 .LC0: 4 .string "%d\n" 5 .text 6 .globl main 7 .type main, @function 8 main: ・・・ 13 movl %esp, %ebp 14 pushl %ecx 15 subl $36, %esp 16 movl $1024, -12(%ebp) 17 movl -12(%ebp), %eax 18 shrl %eax 19 movl %eax, -8(%ebp) ・・・ 32 .section .note.GNU-stack,"",@progbits
どちらも単純に右シフトをすることで除算を行っている。
割り算 vs 右シフト(割る2 符号なし)の結果
実行速度は変わらない。