代码之家  ›  专栏  ›  技术社区  ›  brickner

十六进制数上的biginteger.parse()给出负数

  •  5
  • brickner  · 技术社区  · 15 年前

    我已经开始使用.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,一切都会很好地工作。

    这是我的坏习惯吗?这是一个错误吗? 双整数 ?

    1 回复  |  直到 15 年前
        1
  •  11
  •   Guffa    15 年前

    这正是这个方法应该做的。

    MSDN: BigInteger.Parse Method :

    “如果值是十六进制字符串,则 Parse(String,NumberStyles)方法 将值解释为负数 用二的补码存储 前两个表示 十六进制数字大于或 等于0x80。也就是说, 方法解释最高顺序 值中第一个字节的位作为 符号位。以确保 十六进制字符串正确 解释为正数, 值中的第一个数字必须具有值 为零。例如,方法 将0x80解释为负值, 但它解释了0x080或 0x080为正值。“