转换十六进制值" 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不返回错误字符串,而是返回转换后的八进制值。
任何人都可以解释原因吗?
答案 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
的八进制表示,则您需要使用其他方法。