public NetBigInteger Add(
                NetBigInteger value)
            {
                if (m_sign == 0)
                    return value;

                if (m_sign != value.m_sign)
                {
                    if (value.m_sign == 0)
                        return this;

                    if (value.m_sign < 0)
                        return Subtract(value.Negate());

                    return value.Subtract(Negate());
                }

                return AddToMagnitude(value.m_magnitude);
            }
            public NetBigInteger Subtract(
                NetBigInteger n)
            {
                if (n.m_sign == 0)
                    return this;

                if (m_sign == 0)
                    return n.Negate();

                if (m_sign != n.m_sign)
                    return Add(n.Negate());

                int compare = CompareNoLeadingZeroes(0, m_magnitude, 0, n.m_magnitude);
                if (compare == 0)
                    return Zero;

                NetBigInteger bigun, lilun;
                if (compare < 0)
                {
                    bigun = n;
                    lilun = this;
                }
                else
                {
                    bigun = this;
                    lilun = n;
                }

                return new NetBigInteger(m_sign * compare, doSubBigLil(bigun.m_magnitude, lilun.m_magnitude), true);
            }