符号付き32ビットまたは64ビット整数の場合、-x
と~x + 1
は同じ結果を返します。-xと〜x + 1の違い
しかし、私はいくつかの質問があります:
- コンパイラは、同じ操作としてそれらを翻訳していましたか?
- なぜですか?
- そうでない場合、どのように翻訳されますか?
- そうでなければ、
-x
は直接ハードウェア実装をしていますか?
符号付き32ビットまたは64ビット整数の場合、-x
と~x + 1
は同じ結果を返します。-xと〜x + 1の違い
しかし、私はいくつかの質問があります:
-x
は直接ハードウェア実装をしていますか?コンパイラはそれらを同じ操作として変換しますか?
これは、コンパイラがどのくらいスマートで、最適化を有効にしているかどうかによって異なります。一般的に、良いコンパイラは両方に対して同じコードを生成すると期待できます。
なぜですか?
一部オプティマイザは、-x
に~x + 1
を最適化するためのルールを持っている、いくつかはしないでください。この種の最適化は通常peephole optimizerに含まれていますので、詳細はリンク先の記事をお読みください。
翻訳されていない場合、どのように翻訳されますか?
ターゲットプラットフォームによって異なります。 ~x + 1
は、他のプラットフォームで
not %eax
inc %eax
に変換されるかもしれないのに対し、例えば、i386で、eax
レジスタのx
で、-x
は
neg %eax
に変換されるかもしれない、翻訳が異なっています。例えば、ARM上で、最初は
rsb r0,r0,#0
であり、第二は、そうでない場合は、-xは、直接ハードウェア実装を持っているん
mvn r0,r0
add r0,r0,#1
のですか?
は、典型的には単に定義により0 − X = − Xとしてゼロから値を減算し、否定の指示またはコンパイラのいずれかです。
x86、MIPS、ARM、PowerPC、さらにはAVR(8ビットRISCマイクロコントローラ)の場合は、http://gcc.godbolt.org/でコンパイラ出力を見てください。 –
@PeterCordesありがとう、何が起こるかを見るには素晴らしいリンクです!私はそれらがx86-64 clangを除いて同じ出力に変換されていることがわかります。 –
?最適化などを有効にすることを忘れましたか? [clang3.7.1(https://godbolt.org/g/SUh9T3)で 'neg edi' /' mov eax、edi'/'ret'と同じようにコンパイルします。誰も、最適化されていないコンパイラの出力については気にしません。 –