2017-05-23 29 views
3

雖然十六進制值「FFFFFFFF00」轉換成使用MS Excel中HEX2OCT八進制值,則它應該返回「錯誤字符串」按規則提到hereHEX2OCT公式返回不正確的結果

如果數是負數,HEX2OCT忽略位置並返回一個10個字符的八進制數。

如果數字爲負值,則不能小於FFE0000000,如果數字爲正值,則不能大於1FFFFFFF。

如果number不是有效的十六進制數,HEX2OCT返回#NUM!錯誤值。

如果HEX2OCT需要多個地方的字符,它會返回#NUM!錯誤值。

如果地方不是整數,它將被截斷。

如果地方不是數字,HEX2OCT會返回#VALUE!錯誤值。

如果地方是負數,HEX2OCT會返回#NUM!錯誤值。

但它計算並返回爲「7777777400」,而不考慮鏈接中提到的規則/備註。

例如:

在計算HEX2OCT,

作爲每Excel的規則,如果數是正的,它不能超過1FFFFFFF(十六進制)<更大 - > 3777777777(辛)< - > 536870911(十進制)。

但在計算FFFFFFFF00(十六進制)<→7777777400(oct)<→1099511627520(十進制)的HEX2OCT時。

這裏十六進制值FFFFFFFF00大於1FFFFFFF,但MS Excel不返回錯誤字符串,而是返回轉換後的八進制值。

任何人都可以解釋爲什麼嗎?

回答

2

FFFFFFFF00實際上在hex2oct的範圍內,因爲它是一個負數。

根據該文檔,它可以處理的最大負數是FFE0000000,當它轉換爲小數時爲-536870912。將你的「大」十六進制轉換爲十進制數產生-256

FFFFFFFF00的值看起來如此之大的原因是因爲它是負數。第一位設置爲1(當轉換爲二進制時),表示該數字爲負數。使用two's complement以二進制計算負數,通過翻轉每一位然後將數字加1來找到負數。


撤消補:

你的大數字,二進制表示:

1111111111111111111111111111111100000000 

減去1

1111111111111111111111111111111011111111 

翻轉所有位:

0000000000000000000000000000000100000000 

即256

所以..基本上如果六角看起來大,但第一位是1那麼它實際上是一個小負,以及您的允許值範圍內。

最後,當你hex2oct你不會得到一個負號,因爲我們仍然不是十進制符號。你的八進制的第一位仍然是1(當轉換爲二進制時),因爲它仍然是相同的數字,只是在不同的計數系統中表示。

1

的線索來自早前在文檔頁面你報價:

HEX2OCT函數的語法有以下參數:

必需。您要轉換的十六進制數字。數字不能包含超過10個字符。最重要的 位數是符號位。其餘的39位是大小爲 位。負數用2的補碼錶示。

十六進制值FFFFFFFF00對應的二進制值

1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 

,並作爲文件說,「最顯著位爲符號位...二進制補碼」。所以這個值代表負數的數字。根據補碼規則,它實際上代表-256。這很好,因爲它不是「小於FFE0000000」,因爲FFE0000000-2097152

如果你真的想治療FFFFFFFF00作爲無符號數量,並獲得小數1099511627520的八進制表示,你需要使用其他方法。