MS Excel中的HEX2OCT公式返回不正确的结果

MS Excel中的HEX2OCT公式返回不正确的结果,excel,excel-formula,excel-2010,vba,Excel,Excel Formula,Excel 2010,Vba,使用MS Excel的Hex2Oct将十六进制值“FFFFFF00”转换为八进制值时,应按照所述规则返回“错误字符串”: 若数字为负数,HEX2OCT将忽略位置并返回一个10个字符的八进制数字 若数字为负数,则不能小于FF0000000;若数字为正数,则不能大于1FFFFFF 如果number不是有效的十六进制数,HEX2OCT将返回#NUM!错误值 如果HEX2OCT需要多于个places字符,它将返回#NUM!错误值 如果places不是整数,它将被截断 如果places是非数字的,HEX2

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

若数字为负数,HEX2OCT将忽略位置并返回一个10个字符的八进制数字

若数字为负数,则不能小于FF0000000;若数字为正数,则不能大于1FFFFFF

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

如果HEX2OCT需要多于个places字符,它将返回#NUM!错误值

如果places不是整数,它将被截断

如果places是非数字的,HEX2OCT将返回#值!错误值

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

但它计算并返回为“777 400”,而不考虑链接中提到的规则/备注

例如:

在计算HEX2OCT时

根据Excel规则,如果数字为正数,则不能大于1FFFFFF(十六进制)377777(十月)536870911(十进制)

但在计算FFFFFF00(十六进制)77777 400(十月)1099511627520(十进制)的HEX2OCT时

此处十六进制值FFFFFFFF 00大于1FFFFFF,但MS Excel不返回错误字符串,而是返回转换后的八进制值


有人能解释为什么吗?

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

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

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


取消二者的互补:

对于大数字,二进制表示法为:

 1111111111111111111111111111111100000000
减去
1

 1111111111111111111111111111111011111111
翻转所有位:

 0000000000000000000000000000000100000000
是256

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


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

线索在前面引用的文档页面中:

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

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

十六进制值
FFFFFFFF 00
对应于二进制值

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

如果您确实希望将
FFFFFFFF00
视为无符号量,并获取十进制的八进制表示形式
1099511627520
,则需要使用另一种方法