使用int作为符号有什么意义?

时间:2013-03-15 22:40:49

标签: c# biginteger

因为我需要查看BigInteger中的一些方法,所以我将DotPeek添加到程序集中。然后我发现了一些奇怪的东西:

internal int _sign;

为什么要使用int作为数字的符号?没有理由,或者有什么我想念的东西。我的意思是,他们可以使用BitArrayboolbyte。为何选择int

5 个答案:

答案 0 :(得分:2)

如果你看一下反编译代码中_sign字段的一些用法,你可能会发现这样的事情:

if ((this._sign ^ other._sign) < 0)
    return this._sign >= 0 ? 1 : -1;

基本上int类型允许使用乘法比较两个值的符号。显然,bytebool都不允许这样做。

还有一个问题:为什么不Int16呢,因为它会消耗更少的内存?这可能与对齐有关。

答案 1 :(得分:1)

将符号存储为int允许您简单地乘以符号以将其应用于计算结果。转换为更简单的类型时,这可能会派上用场。

答案 2 :(得分:1)

布尔只能有2个状态。 int的优点是它现在也很容易跟踪特殊值:0

public bool get_IsZero()
{
    return (this._sign == 0);
}

当您阅读其余代码时,还有其他几个快捷方式。

答案 3 :(得分:0)

任何类对象的大小将被舍入到32位(四个字节),因此“保存”三个字节将不会购买任何东西。通过从保存数值的一个字中窃取一点,可以将四个字节缩小到典型BigInteger的大小,但是这种使用所需的额外处理将超过浪费32位整数的成本。

更有趣的可能性可能是BigInteger是一个抽象类,派生类PositiveBigIntegerNegativeBigInteger。由于每个类对象都会有一个单词说明它是什么类,因此这种方法可以为每个创建的BigInteger节省32位。以这种方式使用抽象类会为每个函数调用添加额外的虚拟成员调度,但可能会在大多数函数调用上保存“if”测试(因为例如NegativeBigInteger的方法会凭借事实上,他们被调用this是否定的,他们不必测试它。如果TinyBigInteger(一个BigInteger的值可以适用于单个Integer)和SmallBigIntegerBigInteger,那么这样的设计也可以提高效率其值可能适合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不支持他们的