3

我需要将 BigInteger 打印为负数,但是 ToString("X") 的十六进制重载不正确。

        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

我做错了什么,我该如何解决这个问题?

(我这样做是值得的,所以我可以在这里匹配十六进制输出,以 C++ 数组为例

4

3 回答 3

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");
    }
}
于 2013-03-04T12:55:59.897 回答
2

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

这也适用于整数 - 例如,

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

输出

FFFFFC18
于 2013-03-04T12:56:21.647 回答
1

十六进制不能为负数。所以使用 Math.Sign 和 Math.Abs​​ :

        int v = -126;
        Console.WriteLine("{0} => {1}", v, (Math.Sign(v) < 0 ? "-" : String.Empty) + Math.Abs(v).ToString("X"));
于 2013-03-04T13:04:20.327 回答