BigInteger.ToString(" x")没有正确打印负十六进制数字

时间:2013-03-04 12:47:42

标签: c# .net tostring biginteger

我需要将BigInteger打印为负数,但ToString(“X”)的Hex重载不正确。

        BigInteger be1 = new BigInteger();
        be1 = 0x7e;
        Console.WriteLine(be1.ToString());     // 126
        Console.WriteLine(be1.ToString("X"));  // 7E
        Console.WriteLine(be1.ToString("x"));  // 7e
        Console.WriteLine();
        be1 = BigInteger.Negate(be1);  
        Console.WriteLine(be1.ToString());     // -126  OK
        Console.WriteLine(be1.ToString("X"));  // 82  WRONG
        Console.WriteLine(be1.ToString("x"));  // 82 WRONG

我做错了什么,我该如何解决?

(因为我这样做是值得的,所以我可以match the hex output here, illustrated as an C++ array

3 个答案:

答案 0 :(得分:6)

ToString打印十六进制整数,就好像它是无符号的一样。要使用符号打印十六进制,请取消该值并在其前面加上符号。

BigInteger v = new BigInteger(-10);
string str = "-" + (-v).ToString("X");  // "-0A"

作为一种扩展方法,它可以像这样工作:

class Program
{
    static void Main(string[] args)
    {
        BigInteger v = new BigInteger(-10);
        Console.WriteLine(v.ToSignedHexString());   // Prints: "-0A"
        Console.ReadLine();
    }
}

public static class BigIntegerExtensions
{
    public static string ToSignedHexString(this BigInteger value)
    {
        if (value.Sign == -1)
            return "-" + (-value).ToString("X");
        else
            return value.ToString("X");
    }
}

答案 1 :(得分:2)

数字的十六进制格式输出对于C#永远不会为负。

这也适用于整体 - 例如,

int x = -1000;
Console.WriteLine(x.ToString("X"));

输出

FFFFFC18

答案 2 :(得分:1)

hex不能为负数。所以使用Math.Sign和Math.Abs​​:

        int v = -126;
        Console.WriteLine("{0} => {1}", v, (Math.Sign(v) < 0 ? "-" : String.Empty) + Math.Abs(v).ToString("X"));