2016-02-13 34 views
-7

我的問題是:從int32到int64的轉換是如何工作的?我對這樣做的功能不感興趣,我對感興趣,他們是如何做到這一點的。比特級發生了什麼?從int32到int64的轉換如何工作

我特別感興趣負int32(即-23)如何轉換爲int64。

+7

通過符號擴展。閱讀整數表示(對於寬度類型的2的補碼)。 – Olaf

+0

「通常的方式」,就是將簽名的'short'或'char'擴展爲更大類型的相同方式。沒有太多辦法可以這麼做 - 我實際上只能想到一個@Olaf提到的方法。 – usr2564301

+0

@Jongware:不一定。基本類型不一定是2的補碼。 – Olaf

回答

2

有關在符號擴展中會發生什麼的答案取決於有符號整數的表示方式。有幾種方法可以用來以二進制形式表示負數。最常見的變體是:

  1. 兩個補碼。迄今爲止最常見的。
  2. 補碼。我相信,有時用在DSP系統中。
  3. 符號和大小。
  4. 過量K.用於浮點指數。
  5. 基數-2。

這很有可能是另外幾個變種,但是因爲該列表中的第一個可能涵蓋至少99%的計算機系統,這裏的讀者將會遇到,而其他四個將是絕大多數其餘的系統(實際上,我只有在「現實生活」中遇到過量的K,其他人在我的計算機上工作30多年,仍然是理論上的)。後兩種形式在C99標準中是不允許的,所以這是不可能的[但是並不絕對禁止爲不符合目標系統的C編譯器編寫代碼 - 你不能聲稱它支持完整的C99標準]

我現在將解釋一個符號擴展如何在這些數字系統中的每一箇中工作。我不打算解釋每個系統在其他方面的工作原理,或者爲什麼選擇某個特定的系統,他們在哪裏使用,或者其他類似的東西。這可能屬於「計算機體系結構書」。有關不同號碼系統的更多詳細信息,請參見Wikipidea here中的文章。

我將給出兩個4位數字如何轉換爲它們各自的8位版本的示例 - 爲了節省輸入大量的1和0,原理是相同的,只是更多的數字。

兩補:

採取31位(符號位),並將其複製到位32..63。大多數64位處理器都有特定的指令來執行此步驟,以便從32位到64位的轉換是自動的。

值5是0101爲四個比特數,複製位3 - > 00000101. -6在4位是1010,複製位3 - > 11111010.

一的補碼:

與二進制補碼相同 - 唯一真正的區別是有一個負64,由64個「1」組成。

值5是0101,爲4位數字,將位3複製到位4..7-> 00000101。4位中的-6是1001,將位3複製到位4..7 - > 11111001。

成位63的擴展數字的其餘符號和幅值

移動鑽頭31保持爲零。

值5是0101作爲一個四位數字,將位3複製到位7並替換爲零 - > 00000101. - 4位中的-6是1110,將位3複製到位7,並替換爲零 - > 10000110.

過量ķ

由於過量K是「偏置」表示,標誌延伸裝置正火,然後重新偏壓具有較大恆定的數量。換句話說,減去2 並且加上2 [或「add 2 -2 」]。

值5是1101爲四張比特數,減去8,再加入128 - > 10000101. -6在4位是0010,減去8,再加入128 - > 01111010.

(這是經常在浮點數的指數中使用 - 我相信,再加上最高位的符號,可以將所有「常規」浮點數作爲32位或64位整數進行比較,並仍然表現爲預計 - 但不要在你的程序中使用它!)。

基地-2

這是一個非常奇怪的一個,作爲值爲-2 價值,其中,如果你按照上面的鏈接,你將看到的是不是在所有瑣碎遵循。奇數位是負數,偶數位數是正數。然而,符號擴展是微不足道的 - 只需將零添加到相關級別,因爲每一位都有符號或不是偶數或奇數。

值5是0101爲四張比特數,用零填充擴展:00000101. -6在4位是1110,用零填補使00001110.

+0

請注意,此問題仍然標記爲C/C++。你可能想提一提[ISO C99要求二進制補碼,補碼或符號/幅度](http://stackoverflow.com/questions/13652556/what-happens-when-i-assign-long-int-to- INT-在C#comment18743414_13652796)。根據該評論:[見第6.2.6.2節](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf)。無論如何,+ 1尤其適用於其他兩種表示。 –

+0

[ARM加載/存儲指令](http://www.peter-cockerell.net/aalp/html/ch-3.html)顯然使用符號/幅度表示對位移進行編碼,因爲符號位仍然是符號當它是一個寄存器偏移而不是立即。 RE:將浮點數作爲整數進行比較:是的,IEEE浮點數按正確的順序排序爲有符號整數。我不確定denormals,你是對的,這是有點脆弱。如果你沒有獲得大的加速並且可以確保它是安全的,那麼不要依賴於IEEE FP表示。再加上它對於閱讀你的程序的人來說很奇怪。 –

+0

將float位模式作爲整數進行比較的更新:由於其有偏指數,IEEE浮點數正確比較爲符號+量值整數。 [如果使用二進制補碼硬件比較,除非兩個浮點數都是負數,否則所有函數都可以使用:在這種情況下,順序是顛倒的](https://en.wikipedia.org/wiki/IEEE_754-1985#Representation_of_numbers)。另外,+ NaN值比較> + Inf。 -NaNs在0和-Inf之間排序(或低於-Inf,從0開始最遠,如果兩個整數均爲負數時顛倒順序)。儘管如此,這種設計顯然允許在int和FP cmp之間共享一些硬件。 –