7

我已经开始使用 .NET 4 System.Numerics.BigInteger 结构,但遇到了问题。

我正在尝试解析一个包含没有符号(正)的十六进制数字的字符串。我得到一个负数。

例如,我执行以下两个断言:

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吗?

4

1 回答 1

12

这正是该方法应该做的。

MSDN:BigInteger.Parse 方法

“如果 value 是一个十六进制字符串,如果 value 的前两个十六进制数字大于或等于 0x80,则 Parse(String, NumberStyles) 方法将 value 解释为使用二进制补码表示存储的负数。换句话说,该方法解释value 中第一个字节的最高位为符号位。为确保将十六进制字符串正确解释为正数,value 中的第一个数字必须为零。例如,该方法将 0x80 解释为负值,但它将 0x080 或 0x0080 解释为正值。”

于 2010-06-06T09:55:18.117 回答