MS Excel中的HEX2OCT公式返回不正确的结果
使用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不返回错误字符串,而是返回转换后的八进制值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
有人能解释为什么吗?
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
,则需要使用另一种方法