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

如果number为负数,则HEX2OCT会忽略位置并返回10个字符的八进制数字。
如果number为负,则不能小于FFE0000000,如果number为正,则不能大于1FFFFFFF。
如果number不是有效的十六进制数,则HEX2OCT返回#NUM!错误值。
如果HEX2OCT需要多个字符,则返回#NUM!错误值。
如果places不是整数,则将其截断。
如果place是非数字的,则HEX2OCT返回#VALUE!错误值。
如果place为负数,则HEX2OCT返回#NUM!错误值。

但是它计算并返回为“ 7777777400”,而没有考虑链接中提到的规则/注释。
例如:
在计算HEX2OCT时,
根据Excel规则,如果数字为正数,则不能大于1FFFFFFF(hex) 3777777777(oct) 536870911(十进制)。
但是在计算FFFFFFFF00(十六进制) 7777777400(oct) 1099511627520(decimal)的HEX2OCT时。
在这里,十六进制值FFFFFFFF00大于1FFFFFFF,但是MS Excel不会返回错误字符串,而是会返回转换后的八进制值。
谁能解释为什么?

最佳答案

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

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

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



取消两者的互补:

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

 1111111111111111111111111111111100000000


减去1

 1111111111111111111111111111111011111111


翻转所有位:

 0000000000000000000000000000000100000000


256

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

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

10-05 21:29