if (val.sign < 0)
while (vI >= 0)
    public BigInteger add(BigInteger val) throws ArithmeticException    {        if (val.sign == 0 || val.magnitude.length == 0)            return this;        if (this.sign == 0 || this.magnitude.length == 0)            return val;        if (val.sign < 0)        {            if (this.sign > 0)                return this.subtract(val.negate());        }        else        {            if (this.sign < 0)                return val.subtract(this.negate());        }        // both BigIntegers are either +ve or -ve; set the sign later        int[] mag,         op;        if (this.magnitude.length < val.magnitude.length)        {            mag = new int[val.magnitude.length + 1];            System.arraycopy(val.magnitude, 0, mag, 1, val.magnitude.length);            op = this.magnitude;        }        else        {            mag = new int[this.magnitude.length + 1];            System.arraycopy(this.magnitude, 0, mag, 1, this.magnitude.length);            op = val.magnitude;        }        return new BigInteger(this.sign, add(mag, op));    }