BigInteger.Parse()对十六进制数的解析会得到负数

9

我开始使用.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");

第一个断言成功,第二个断言失败。在BigInteger中,我实际上得到的是-8而不是8。
问题似乎出现在16进制数以1位开始而不是0位开始(介于8和F之间的数字)。如果我添加一个前导0,一切都能完美地运行。
这是我的错误用法吗?还是BigInteger的一个bug?
1个回答

14

这恰好是该方法要完成的功能。

MSDN: BigInteger.Parse方法:

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


5
为什么?有计算机科学上的原因吗? - Patrick M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接