因为我需要查看BigInteger
中的一些方法,所以我将DotPeek添加到程序集中。然后我发现了一些奇怪的东西:
internal int _sign;
为什么要使用int
作为数字的符号?没有理由,或者有什么我想念的东西。我的意思是,他们可以使用BitArray
,bool
或byte
。为何选择int
?
答案 0 :(得分:2)
如果你看一下反编译代码中_sign
字段的一些用法,你可能会发现这样的事情:
if ((this._sign ^ other._sign) < 0)
return this._sign >= 0 ? 1 : -1;
基本上int
类型允许使用乘法比较两个值的符号。显然,byte
和bool
都不允许这样做。
还有一个问题:为什么不Int16
呢,因为它会消耗更少的内存?这可能与对齐有关。
答案 1 :(得分:1)
将符号存储为int允许您简单地乘以符号以将其应用于计算结果。转换为更简单的类型时,这可能会派上用场。
答案 2 :(得分:1)
布尔只能有2个状态。 int的优点是它现在也很容易跟踪特殊值:0
public bool get_IsZero()
{
return (this._sign == 0);
}
当您阅读其余代码时,还有其他几个快捷方式。
答案 3 :(得分:0)
任何类对象的大小将被舍入到32位(四个字节),因此“保存”三个字节将不会购买任何东西。通过从保存数值的一个字中窃取一点,可以将四个字节缩小到典型BigInteger的大小,但是这种使用所需的额外处理将超过浪费32位整数的成本。
更有趣的可能性可能是BigInteger
是一个抽象类,派生类PositiveBigInteger
和NegativeBigInteger
。由于每个类对象都会有一个单词说明它是什么类,因此这种方法可以为每个创建的BigInteger节省32位。以这种方式使用抽象类会为每个函数调用添加额外的虚拟成员调度,但可能会在大多数函数调用上保存“if”测试(因为例如NegativeBigInteger
的方法会凭借事实上,他们被调用this
是否定的,他们不必测试它。如果TinyBigInteger
(一个BigInteger
的值可以适用于单个Integer
)和SmallBigInteger
(BigInteger
,那么这样的设计也可以提高效率其值可能适合Long
)。我不知道微软是否考虑过这样的设计,或者说会有什么样的权衡。
答案 4 :(得分:0)
获取一个数字,指示当前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);
}
}
}
不要使用字节或其他uint,sbyte,ushort,short因为存在CLS和CLS不支持他们的