2016-08-29 20 views
-1

符号付き32ビットまたは64ビット整数の場合、-x~x + 1は同じ結果を返します。-xと〜x + 1の違い

しかし、私はいくつかの質問があります:

  1. コンパイラは、同じ操作としてそれらを翻訳していましたか?
  2. なぜですか?
  3. そうでない場合、どのように翻訳されますか?
  4. そうでなければ、-xは直接ハードウェア実装をしていますか?
+1

x86、MIPS、ARM、PowerPC、さらにはAVR(8ビットRISCマイクロコントローラ)の場合は、http://gcc.godbolt.org/でコンパイラ出力を見てください。 –

+0

@PeterCordesありがとう、何が起こるかを見るには素晴らしいリンクです!私はそれらがx86-64 clangを除いて同じ出力に変換されていることがわかります。 –

+0

?最適化などを有効にすることを忘れましたか? [clang3.7.1(https://godbolt.org/g/SUh9T3)で 'neg edi' /' mov eax、edi'/'ret'と同じようにコンパイルします。誰も、最適化されていないコンパイラの出力については気にしません。 –

答えて

5

コンパイラはそれらを同じ操作として変換しますか?

これは、コンパイラがどのくらいスマートで、最適化を有効にしているかどうかによって異なります。一般的に、良いコンパイラは両方に対して同じコードを生成すると期待できます。

なぜですか?

一部オプティマイザは、-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としてゼロから値を減算し、否定の指示またはコンパイラのいずれかです。

関連する問題