C# C语言中从正数到负数的最佳实践#

C# C语言中从正数到负数的最佳实践#,c#,numbers,negative-number,C#,Numbers,Negative Number,有两种常见的方法可以将正数转换为负数,反之亦然: var a = -a; 及 据我所知,第二个是首选,但为什么呢?在转换数字符号(int、float、double等)时还有其他最佳实践吗 编辑:一元减运算和乘法到-1有什么不同吗?在现场你们可以看到编译器生成的代码 以及: using System; public class C { public int M() { int a = -2; a = -a; return a;

有两种常见的方法可以将正数转换为负数,反之亦然:

var a = -a;

据我所知,第二个是首选,但为什么呢?在转换数字符号(int、float、double等)时还有其他最佳实践吗

编辑:一元减运算和乘法到-1有什么不同吗?

在现场你们可以看到编译器生成的代码

以及:

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
.class私有自动ansi“”
{
}//下课
.class公共自动ansi BEFOREFILDInit C
扩展[mscorlib]System.Object
{
//方法
.方法公共隐藏
实例int32 M()cil托管
{
//方法从RVA 0x2050开始
//代码大小4(0x4)
.maxstack 8
IL_0000:ldc.i4.s-2
IL_0002:负
IL_0003:ret
}//方法C::M的结尾
.方法公共隐藏
实例int32 M1()cil托管
{
//方法从RVA 0x2058开始
//代码大小8(0x8)
.maxstack 2
.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
}//方法C::M1的结尾
.method公共隐藏显示特殊名称rtspecialname
实例void.ctor()cil托管
{
//方法从RVA 0x206c开始
//代码大小7(0x7)
.maxstack 8
IL_0000:ldarg.0
IL_0001:调用实例void[mscorlib]System.Object::.ctor()
IL_0006:ret
}//方法C的结尾::.ctor
}//C类结束
正如您看到的方法M的代码一样,我更加简单和简短。 然后
-a
是更好的方法。

在站点上,您可以看到编译器生成的代码

以及:

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
.class私有自动ansi“”
{
}//下课
.class公共自动ansi BEFOREFILDInit C
扩展[mscorlib]System.Object
{
//方法
.方法公共隐藏
实例int32 M()cil托管
{
//方法从RVA 0x2050开始
//代码大小4(0x4)
.maxstack 8
IL_0000:ldc.i4.s-2
IL_0002:负
IL_0003:ret
}//方法C::M的结尾
.方法公共隐藏
实例int32 M1()cil托管
{
//方法从RVA 0x2058开始
//代码大小8(0x8)
.maxstack 2
.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
}//方法C::M1的结尾
.method公共隐藏显示特殊名称rtspecialname
实例void.ctor()cil托管
{
//方法从RVA 0x206c开始
//代码大小7(0x7)
.maxstack 8
IL_0000:ldarg.0
IL_0001:调用实例void[mscorlib]System.Object::.ctor()
IL_0006:ret
}//方法C的结尾::.ctor
}//C类结束
正如您看到的方法M的代码一样,我更加简单和简短。
那么
-a
是更好的方法。

我不明白你为什么认为第二种方法是首选方法,因为第一种方法简单得多,我一直在使用这种方法。第二种方法也是一种非常常见的方法,但不使用,因为您希望编写最少的代码,但如果您计划将所有内容都弄清楚。。。那么我更喜欢第二种方法。 如果你想的话,你也可以使用Math.abs(x),但我肯定更喜欢第一种方法。如果你想了解更多关于Math.abs的信息,那么你可以通过谷歌找到很多教程。
希望这能在某种程度上解决您的问题。:)

我不明白为什么你认为第二种方法会是首选方法,因为第一种方法简单得多,我一直在使用这种方法。第二种方法也是一种非常常见的方法,但不使用,因为您希望编写最少的代码,但如果您计划将所有内容都弄清楚。。。那么我更喜欢第二种方法。 如果你想的话,你也可以使用Math.abs(x),但我肯定更喜欢第一种方法。如果你想了解更多关于Math.abs的信息,那么你可以通过谷歌找到很多教程。
希望这能在某种程度上解决您的问题。:)

是什么让你认为第二个更可取?在我看来,这太乱了。请注意,如果
a
int.MinValue
/
long.MinValue
,这两者都不会像您天真地期望的那样起作用。我想您的意思是
int a=1
a=-a
诸如此类。我是指任何数字。。。所以乔恩·斯基特——你是对的,但是你没有提出任何正确的版本,也没有回答我一直以来的问题;a=-a;a=数学Abs(a);为什么这个问题有这么多缺点?看看这篇文章,它的评分是238分以上:是什么让你认为第二个更可取?在我看来,这太乱了。请注意,如果
a
int.MinValue
/
long.MinValue
,这两者都不会像您天真地期望的那样起作用。我想您的意思是
int a=1
a=-a
诸如此类。我是指任何数字。。。所以乔恩·斯基特——你是对的,但是你没有提出任何正确的版本,也没有回答我一直以来的问题;a=-a;a=数学Abs(a);为什么这个问题有这么多的缺点-看看这篇文章,评分为238分以上:哦,谢谢!这就是我要找的!哦,谢谢!这就是我要找的!