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分以上:哦,谢谢!这就是我要找的!哦,谢谢!这就是我要找的!