【问题标题】:HEX2OCT formula in MS Excel returns incorrect resultMS Excel 中的 HEX2OCT 公式返回不正确的结果
【发布时间】:2017-05-23 12:36:13
【问题描述】:

使用 MS Excel 的 Hex2Oct 将十六进制值“FFFFFFFF00”转换为八进制值时,应按照here 中提到的规则返回“错误字符串”:

如果 number 为负数,HEX2OCT 会忽略位置并返回一个 10 字符的八进制数。

数字为负数,不能小于FFE0000000,数字为正数,不能大于1FFFFFFF。

如果 number 不是有效的十六进制数,HEX2OCT 返回 #NUM!错误值。

如果 HEX2OCT 需要多个字符,则返回 #NUM!错误值。

如果places 不是整数,则将其截断。

如果places 不是数字,HEX2OCT 返回#VALUE!错误值。

如果 places 是负数,HEX2OCT 返回 #NUM!错误值。

但它在不考虑链接中提到的规则/备注的情况下计算并返回为“7777777400”。

例如:

在计算 HEX2OCT 时,

根据 Excel 规则,如果数字为正数,则不能大于 1FFFFFFF(hex)3777777777(oct)536870911(decimal)。

但是在计算 FFFFFFFF00(hex) 7777777400(oct) 1099511627520(decimal) 的 HEX2OCT 时。

这里的十六进制值 FFFFFFFF00 大于 1FFFFFFF,但是 MS Excel 不返回错误字符串,而是返回转换后的八进制值。

谁能解释一下原因?

【问题讨论】:

    标签: excel excel-formula excel-2010 vba


    【解决方案1】:

    FFFFFFFF00 实际上正好在hex2oct 的范围内,因为它是一个负数。

    根据该文档,它可以处理的最大负数是FFE0000000,转换为十进制时是-536870912。将您的“大”十六进制转换为十进制会产生-256

    FFFFFFFF00 的值看起来这么大的原因是因为它是一个负数。第一位设置为 1(转换为二进制时),表示该数字为负数。负数是使用two's complement 以二进制形式计算的,它是通过翻转每个位然后将数字加 1 来找到的。


    取消二进制补码:

    对于你的大数,二进制表示是:

     1111111111111111111111111111111100000000
    

    减去1:

     1111111111111111111111111111111011111111
    

    翻转所有位:

     0000000000000000000000000000000100000000
    

    256

    所以.. 基本上,如果十六进制看起来很大,但第一位是 1,那么它实际上是一个小的负数,并且在您的允许值范围内。

    最后,当您hex2oct 时,您不会得到负号,因为我们仍然不是十进制表示法。八进制的第一位仍然是 1(转换为二进制时),因为它仍然是相同的数字,只是在不同的计数系统中表示。

    【讨论】:

      【解决方案2】:

      线索位于您引用的文档页面的前面:

      HEX2OCT 函数语法具有以下参数:

      编号必填。要转换的十六进制数。数字不能超过 10 个字符。最重要的 数字位是符号位。剩下的 39 位是幅度 位。负数使用补码表示法表示。

      十六进制值FFFFFFFF00对应二进制值

      1111 1111 1111 1111 1111 1111 1111 1111 0000 0000
      

      正如文档所说,“最重要的位是符号位......二进制补码表示法”。所以这个值代表一个数。根据补码规则,它实际上代表-256。这很好,因为它不是“小于FFE0000000”,因为FFE0000000-2097152

      如果您真的想将FFFFFFFF00 视为无符号 量,并获得十进制1099511627520 的八进制表示,则需要使用另一种方法。

      【讨论】:

        猜你喜欢
        • 2021-01-04
        • 2021-02-02
        • 2021-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-28
        • 1970-01-01
        相关资源
        最近更新 更多