MS Excel中的HEX2OCT公式返回错误的结果

当使用MS Excel的Hex2Oct将hex值“FFFFFFFF00”转换成八进制值时,应按照以下规则返回“错误string”:

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

如果数字是负数,则不能小于FFE0000000,如果数字是正数,则不能大于1FFFFFFF。

如果数字不是有效的hex数字,HEX2OCT返回#NUM! 错误值。

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

如果地方不是一个整数,它将被截断。

如果地方是非数字,HEX2OCT返回#VALUE! 错误值。

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

但它计算和返回为“7777777400”,而不考虑链接中提到的规则/评论。

例如:

在计算HEX2OCT时,

根据Excel规则,如果数字是正数,则不能大于1FFFFFFF(hex)< – > 3777777777(oct)< – > 536870911(十进制)。

但在计算FFFFFFFF00(hex)7777777400(oct)1099511627520(十进制)的HEX2OCT时。

这里hex值FFFFFFFF00大于1FFFFFFF,但MS Excel不会返回错误string,而是返回转换后的八进制值。

谁能解释为什么?

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

根据该文件,它可以处理的最大负数是FFE0000000 ,当转换成小数时是-536870912 。 将你的“大”hex转换为十进制数产生-256

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


撤消二补:

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

  1111111111111111111111111111111100000000 

1

  1111111111111111111111111111111011111111 

翻转所有的位:

  0000000000000000000000000000000100000000 

这是256

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

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

以前在你引用的文档页面中提供了线索:

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

数量必需。 您要转换的hex数字。 数字不能包含超过10个字符。 数字的最重要的位是符号位。 其余的39位是幅度位。 负数用2的补码表示。

hex值FFFFFFFF00对应二进制值

 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 

正如文件所述,“最重要的是符号位……二的补充符号”。 所以这个值代表一个负数 。 通过补码的规则,它实际上代表了-256 。 这很好,因为它不是“小于FFE0000000 ”,因为FFE0000000-2097152

如果你真的想把FFFFFFFF00作为一个无符号的数量,并得到十进制的十进制表示1099511627520 ,你需要使用另一种方法。