Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does BigInteger.ToString("x") prepend a 0 for values between signed.MaxValue (exclusive) and unsigned.MaxValue (inclusive)?

Tags:

c#

biginteger

Examples (asterisks next to odd behavior):

    [Fact]
    public void BigInteger_ToString_behavior_is_odd()
    {
        writeHex(new BigInteger(short.MaxValue)); // 7fff
        writeHex(new BigInteger(short.MaxValue) + 1); // 08000 **
        writeHex(new BigInteger(ushort.MaxValue)); // 0ffff **
        writeHex(new BigInteger(ushort.MaxValue) + 1); // 10000

        writeHex(new BigInteger(int.MaxValue)); // 7fffffff
        writeHex(new BigInteger(int.MaxValue) + 1); // 080000000 **
        writeHex(new BigInteger(uint.MaxValue)); // 0ffffffff **
        writeHex(new BigInteger(uint.MaxValue) + 1); // 100000000

        writeHex(new BigInteger(long.MaxValue)); // 7fffffffffffffff
        writeHex(new BigInteger(long.MaxValue) + 1); // 08000000000000000 **
        writeHex(new BigInteger(ulong.MaxValue)); // 0ffffffffffffffff **
        writeHex(new BigInteger(ulong.MaxValue) + 1); // 10000000000000000
    }

    private static void writeHex(BigInteger value)
    {
        Console.WriteLine(value.ToString("x"));
    }
  • Is there a reason for this?
  • How would I remove this extra zero? Can I just check if the string has a zero at the start and, if so, remove it? Any corner cases to think about?
like image 466
xofz Avatar asked Feb 24 '23 23:02

xofz


2 Answers

Without a leading zero, the number may appear as though it is a negative number of the same number of bits in two's complement. Putting a leading zero ensures that the high bit isn't set, so it can't possibly be interpreted as a negative number.

Go ahead and remove the first character, if it's a zero, unless it's the only character in the string.

like image 64
Rob Kennedy Avatar answered Mar 22 '23 23:03

Rob Kennedy


From my part not sure why this is done, but as you mentioned converting to string and then removing leading zero should do the trick.

like image 22
Shamim Hafiz - MSFT Avatar answered Mar 23 '23 00:03

Shamim Hafiz - MSFT