2016-03-24 4 views
-1

に否定し、その逆に正の数を変換する2つの一般的な方法があります。は、C#

var a = -a; 

var a = (-1)*a; 

は、私が知っているように、第2は、好ましいが、しかし、なぜですか?そして、数値の符号(int、float、doubleなど)を変換する他のベストプラクティスはありますか?

EDIT:単項マイナス演算と-1の乗算に違いはありますか?

+7

あなたは二番目が好ましいと思いますか?私にひどく汚れているようだ。 'a'が' int.MinValue'/'long.MinValue'であると単純に期待しないので、どちらも動作しないことに注意してください... –

+1

' int a = 1'と 'a = -a'のようなもの。 – J3soon

+0

私はどんな数字でも意味します...だからジョン・スケート - あなたは正しいですが、正しいバージョンを示唆せず、私の質問に答えませんでした。 –

答えて

4

オンサイトhttp://tryroslyn.azurewebsites.net/コンパイラによって生成されたコードが表示されます。

とするために:

using System; 
public class C { 
    public int M() { 
     int a = -2; 

     a = -a; 

     return a;    
    } 

    public int M1() { 
     int a = 3; 

     a = (-1) * a; 

     return a; 
    } 
} 

コンパイラが生成します。

.class private auto ansi '<Module>' 
{ 
} // end of class <Module> 

.class public auto ansi beforefieldinit C 
    extends [mscorlib]System.Object 
{ 
    // Methods 
    .method public hidebysig 
     instance int32 M() cil managed 
    { 
     // Method begins at RVA 0x2050 
     // Code size 4 (0x4) 
     .maxstack 8 

     IL_0000: ldc.i4.s -2 
     IL_0002: neg 
     IL_0003: ret 
    } // end of method C::M 

    .method public hidebysig 
     instance int32 M1() cil managed 
    { 
     // Method begins at RVA 0x2058 
     // Code size 8 (0x8) 
     .maxstack 2 
     .locals init (
      [0] int32 
     ) 

     IL_0000: ldc.i4.3 
     IL_0001: stloc.0 
     IL_0002: ldc.i4.m1 
     IL_0003: ldloc.0 
     IL_0004: mul 
     IL_0005: stloc.0 
     IL_0006: ldloc.0 
     IL_0007: ret 
    } // end of method C::M1 

    .method public hidebysig specialname rtspecialname 
     instance void .ctor() cil managed 
    { 
     // Method begins at RVA 0x206c 
     // Code size 7 (0x7) 
     .maxstack 8 

     IL_0000: ldarg.0 
     IL_0001: call instance void [mscorlib]System.Object::.ctor() 
     IL_0006: ret 
    } // end of method C::.ctor 

} // end of class C 

あなたは、私がずっとsimplierと短いメソッドMのためのコードを見ての通り。 次に-aが良い方法です。

+0

ohh、ありがとう!それは私が探しているものです! –

0

私は最初の方がずっと簡単で、いつもこの方法を使用しているので、2番目の方法が好ましい方法だと思うのはなぜわかりません。 2番目の方法も非常に一般的ですが、コードの量を最小限に抑えたい場合には使用されませんが、すべてを明確にする場合は2番目の方法をお勧めします。 Math.abs(x)を使用しても構いませんが、最初の方法を間違いなく推奨します。 Math.absについてもっと知りたい場合は、googleから多くのチュートリアルを見つけることができます。 これはあなたの質問を解決したいと考えています。 :)