我需要将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)
答案 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"));