我已经开始使用.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。
问题似乎是我十六进制从1位开始而不是0位(8和F之间的数字)。如果我添加前导0,一切都很完美。
这对我来说是不是很糟糕?这是BigInteger
中的错误吗?
答案 0 :(得分:11)
这正是该方法应该做的事情。
MSDN: BigInteger.Parse Method:
“如果值是十六进制字符串,则为 Parse(String,NumberStyles)方法 将值解释为负数 使用二进制补码存储 表示如果它的前两个 十六进制数字大于或 等于0x80。换句话说, method解释最高阶 值的第一个字节的位为 标志位。确保一个 十六进制字符串是正确的 解释为正数, 值的第一个数字必须具有值 零。例如,该方法 将0x80解释为负值, 但它解释为0x080或 0x0080为正值。“