割り算 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 符号なし)の結果

 実行速度は変わらない。

割り算 VS 右シフト その3に続く