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

时间:2017-05-23 12:36:13

标签: excel excel-vba excel-formula excel-2010 vba

转换十六进制值" FFFFFFFF00"使用MS Excel的Hex2Oct进入八进制值,它应返回"错误字符串"根据提到的规则here

  

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

     

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

     

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

     

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

     

如果places不是整数,则会被截断。

     

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

     

如果地点为负数,HEX2OCT会返回#NUM!错误值。

但它计算并返回" 7777777400"不考虑链接中提到的规则/备注。

例如:

在计算HEX2OCT时,

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

但是在为FFFFFFFF00(十六进制)计算HEX2OCT时 - < - > 7777777400(oct)< - > 1099511627520(十进制)。

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

任何人都可以解释原因吗?

2 个答案:

答案 0 :(得分:2)

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

根据该文档,它可以处理的最大负数是FFE0000000,当转换为十进制时,-536870912。转换你的"大"十六进制到十进制产生-256

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

撤消两个补充:

对于您的大号,二进制表示形式为:

 1111111111111111111111111111111100000000

减去1

 1111111111111111111111111111111011111111

翻转所有位:

 0000000000000000000000000000000100000000

这是256

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

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

答案 1 :(得分:1)

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

  

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

     

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

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

1111 1111 1111 1111 1111 1111 1111 1111 0000 0000

正如文档所说,"最重要的一点是符号位......两个补码表示法"。因此,此值表示否定数字。根据两个补码的规则,它实际上代表-256。这很好,因为它不是FFE0000000",因为FFE0000000-2097152

如果您确实希望将FFFFFFFF00视为无符号数量,并获得十进制1099511627520的八进制表示,则您需要使用其他方法。