C# 使用int作为符号有什么意义?
因为我需要查看C# 使用int作为符号有什么意义?,c#,biginteger,C#,Biginteger,因为我需要查看biginger中的一些方法,所以我查看了程序集。然后我发现了一些很奇怪的事情: internal int _sign; 为什么要用int作为数字的符号?是没有理由,还是我错过了什么。我的意思是,他们可以使用位数组,或者bool,或者字节。为什么使用int?将符号存储为int可以让您简单地乘以符号,将其应用于计算结果。当转换为更简单的类型时,这可能很方便。将符号存储为int可以让您简单地乘以符号,将其应用于计算结果。当转换为更简单的类型时,这可能很有用。一个布尔只能有两种状态。i
biginger
中的一些方法,所以我查看了程序集。然后我发现了一些很奇怪的事情:
internal int _sign;
为什么要用
int
作为数字的符号?是没有理由,还是我错过了什么。我的意思是,他们可以使用位数组
,或者bool
,或者字节
。为什么使用int
?将符号存储为int可以让您简单地乘以符号,将其应用于计算结果。当转换为更简单的类型时,这可能很方便。将符号存储为int可以让您简单地乘以符号,将其应用于计算结果。当转换为更简单的类型时,这可能很有用。一个布尔只能有两种状态。int的优点是现在跟踪特殊值0也很简单
public bool get_IsZero()
{
return (this._sign == 0);
}
阅读代码的其余部分时,还有一些类似的快捷方式。一个bool只能有两种状态。int的优点是现在跟踪特殊值0也很简单
public bool get_IsZero()
{
return (this._sign == 0);
}
阅读代码的其余部分时,还有一些类似的快捷方式。如果您查看反编译代码中
\u sign
字段的一些用法,您可能会发现如下内容:
if ((this._sign ^ other._sign) < 0)
return this._sign >= 0 ? 1 : -1;
if((本符号^其他符号)<0)
返回此。\u符号>=0?1 : -1;
基本上,int
type允许使用乘法比较两个值的符号。显然,无论是byte
,还是bool
都不允许这样做
还有一个问题:为什么不
Int16
,因为它会消耗更少的内存?这可能与对齐有关。如果您查看反编译代码中\u sign
字段的一些用法,您可能会发现如下内容:
if ((this._sign ^ other._sign) < 0)
return this._sign >= 0 ? 1 : -1;
if((本符号^其他符号)<0)
返回此。\u符号>=0?1 : -1;
基本上,int
type允许使用乘法比较两个值的符号。显然,无论是byte
,还是bool
都不允许这样做
还有一个问题:为什么不
Int16
,因为它会消耗更少的内存?这可能与对齐有关。任何类对象的大小都将被舍入到32位(四个字节),因此“保存”三个字节不会买任何东西。通过从保存数值的一个字中偷取一位,可以将典型BigInteger的大小减少四个字节,但这种使用所需的额外处理将超过浪费32位整数的成本
一个更有趣的可能性是,
biginger
是一个抽象类,派生类是PositiveBigInteger
和NegativeBigInteger
。由于每个类对象都会有一个词来表示它是什么类,因此这种方法将为创建的每个BigInteger节省32位。以这种方式使用抽象类会为每个函数调用添加一个额外的虚拟成员分派,但可能会对大多数函数调用保存一个“if”测试(因为例如NegativeBigInteger
的方法会通过调用this
为负的事实而知道,它们不必对其进行测试)。如果存在TinyBigInteger
(abiginger
,其值可以放入单个Integer
)和smallbiginger
(abiginger
,其值可以放入Long
)的类,则这种设计也可以提高效率。我不知道微软是否考虑过这样的设计,也不知道折衷方案是什么。任何类对象的大小都将被舍入到32位(四个字节),所以“保存”三个字节不会买任何东西。通过从保存数值的一个字中偷取一位,可以将典型BigInteger的大小减少四个字节,但这种使用所需的额外处理将超过浪费32位整数的成本
一个更有趣的可能性是,
biginger
是一个抽象类,派生类是PositiveBigInteger
和NegativeBigInteger
。由于每个类对象都会有一个词来表示它是什么类,因此这种方法将为创建的每个BigInteger节省32位。以这种方式使用抽象类会为每个函数调用添加一个额外的虚拟成员分派,但可能会对大多数函数调用保存一个“if”测试(因为例如NegativeBigInteger
的方法会通过调用this
为负的事实而知道,它们不必对其进行测试)。如果存在TinyBigInteger
(abiginger
,其值可以放入单个Integer
)和smallbiginger
(abiginger
,其值可以放入Long
)的类,则这种设计也可以提高效率。我不知道微软是否考虑过这样的设计,也不知道折衷方案是什么。获取一个数字,表示当前System.Numerics.BigInteger对象的符号(负号、正号或零)
-1该对象的值为负值。0此对象的值为0(零)。1该对象的值为正值
这意味着
class Program
{
static void Main(string[] args)
{
BigInteger bInt1 = BigInteger.Parse("0");
BigInteger bInt2 = BigInteger.Parse("-5");
BigInteger bInt3 = BigInteger.Parse("5");
division10(bInt1);//it is Impossible
division10(bInt2);//it is Possible : -2
division10(bInt3);//it is Possible : 2
}
static void division10(BigInteger bInt)
{
double d = 10;
if (bInt.IsZero)
{
Console.WriteLine("it is Impossible");
}
else
{
Console.WriteLine("it is Possible : {0}", d / (int)bInt);
}
}
}
不要使用byte或其他uint、sbyte、ushort、short,因为exist CLS和CLS不支持它们的获取一个数字,该数字指示当前System.Numerics.BigInteger对象的符号(负、正或零) -1该对象的值为负值。0此对象的值为0(零)。1该对象的值为正值 这意味着
class Program
{
static void Main(string[] args)
{
BigInteger bInt1 = BigInteger.Parse("0");
BigInteger bInt2 = BigInteger.Parse("-5");
BigInteger bInt3 = BigInteger.Parse("5");
division10(bInt1);//it is Impossible
division10(bInt2);//it is Possible : -2
division10(bInt3);//it is Possible : 2
}
static void division10(BigInteger bInt)
{
double d = 10;
if (bInt.IsZero)
{
Console.WriteLine("it is Impossible");
}
else
{
Console.WriteLine("it is Possible : {0}", d / (int)bInt);
}
}
}
不要使用byte或其他uint、sbyte、ushort、short,因为exist CLS和CLS不支持它们的它的上下文是什么,没有上下文很难说。有很多r