BigInteger.Parse () на шестнадцатеричном числе дает отрицательные числа - PullRequest
5 голосов
/ 06 июня 2010

Я начал использовать .NET 4 System.Numerics.BigInteger Structure и столкнулся с проблемой.

Я пытаюсь разобрать строку, содержащую шестнадцатеричное число без знака (положительное значение). Я получаю отрицательное число.

Например, я делаю следующие два утверждения:

Assert.IsTrue(System.Int64.Parse("8", NumberStyles.HexNumber, CultureInfo.InvariantCulture) > 0, "Int64");
Assert.IsTrue(System.Numerics.BigInteger.Parse("8", NumberStyles.HexNumber, CultureInfo.InvariantCulture) > 0, "BigInteger");

Первое утверждение успешно, второе утверждение не выполнено. Я на самом деле получаю -8 вместо 8 в BigInteger.

Проблема, кажется, заключается в том, что шестнадцатеричное число начинается с 1, а не 0 бит (цифра от 8 до F включительно). Если я добавлю ведущий 0, все работает отлично.

Это плохое использование с моей стороны? Это ошибка в BigInteger?

1 Ответ

11 голосов
/ 06 июня 2010

Это именно то, что должен делать метод.

MSDN: BigInteger.Parse Method :

"Если значение является шестнадцатеричной строкой,Метод Parse (String, NumberStyles) интерпретирует значение как отрицательное число, сохраненное с использованием представления дополнения до двух, если его первые две шестнадцатеричные цифры больше или равны 0x80. Другими словами, метод интерпретирует бит старшего разряда первого байта взначение как бит знака. Чтобы убедиться, что шестнадцатеричная строка правильно интерпретируется как положительное число, первая цифра в значении должна иметь значение, равное нулю. Например, метод интерпретирует 0x80 как отрицательное значение, но он интерпретирует либо 0x080или 0x0080 в качестве положительного значения. "

...