BigInteger 乘法中的前导零

Leading zero in BigInteger multiplication

我使用简单的函数来乘大整数。有时输出会包含一个前导零字节。为什么会发生,我该如何预防?

PS:a和b已经小于mod

private byte[] multiply(final byte[] a, final byte[] b, final BigInteger mod) {
    BigInteger M1 = new BigInteger(1, a);
    BigInteger M2 = new BigInteger(1, b);

    BigInteger out = M1.multiply(M2).mod(mod);

    res = out.toByteArray();
}

如果(正)值的第一个字节是 128 到 255,则添加额外的零字节。

需要这个字节,以便生成的字节至少有一个符号位 (https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#toByteArray%28%29)

BigInteger.valueOf(5L).toByteArray()

returns 只有一个字节 (5) 的字节数组。

BigInteger.valueOf(128L).toByteArray()

returns 只有两个字节的字节数组(无符号表示形式为 0 和 128)。这是为了区分

的结果
BigInteger.valueOf(-128L).toByteArray()

其中returns也是一个有两个字节的字节数组(255, 128 无符号表示)