3

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

何か間違ったことをしているのですが、どうすれば修正できますか?

(これを行う価値があるため、C++ 配列として示されている 16 進出力をここで一致させることができます)

4

3 に答える 3

6

ToStringあたかも符号なしであるかのように 16 進整数を出力します。符号付きの 16 進数で出力するには、値を否定し、前に符号を付けます。

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# では、数値の 16 進形式の出力が負になることはありません。

これは int にも当てはまります - たとえば、

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

出力

FFFFFC18
于 2013-03-04T12:56:21.647 に答える
1

16 進数を負にすることはできません。したがって、 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 に答える