2016-12-03 50 views
-3

這是一個雙重問題。是否將某些數據類型轉換爲與算術右移相同的更大數據類型?

  1. 我一直在閱讀關於編譯器如何處理代碼的錯綜複雜的問題,並且我有這種困惑。這兩個過程似乎都遵循相同的符號整數符號擴展邏輯。那麼轉換是否僅僅作爲算術右移來實現呢?

  2. 其中一個例子規定的函數,如

    Int Fun1(unsigned word) { 
         Return (int) ((word << 24) >> 24); 
    } 
    

    傳遞的參數爲0×87654321。 由於這將在轉換爲二進制文件時進行簽名,因此轉換將如何進行?我的邏輯是,左移應提取最後8位,將MSB保留爲0,然後我們在右移時擴展。這個邏輯是否正確?

編輯:我知道downvote可能是由於未指定的信息。假設一個32位的大端機器,其中有符號整數的二進制補碼。

+0

你在問關於補碼? – tijko

+0

'word'被聲明爲'unsigned',所以應該編譯爲邏輯而不是算術移位。轉換後執行有符號整數轉換。 – Neapolitan

+0

如果'int'是32位,那麼'0x87654321'的類型是'unsigned int' –

回答

1

鑑於OP的「假設一個32位...機器帶有有符號整數的二進制補碼」。 (這意味着32位unsigned)時轉換成二進制

0x87654321是一個十六進制常數

0×87654321由於這將被簽署。它有unsigned的類型。它沒有簽名。


// Int Fun1(unsigned word) { 
int Fun1(unsigned word) { 
     Return (int) ((word << 24) >> 24); 
} 

Fun1(0x87654321)導致unsigned word具有0x87654321值。沒有發生類型和價值轉換。

word << 24的值爲0x21000000,仍然是unsigned的類型。

(word << 24) >> 24的值爲0x21,仍然是unsigned的類型。

鑄造到int保留相同的值0x21,但現在鍵入int


所以在轉換簡單地實現算術右移?

令人懷疑,因爲沒有簽名轉移編碼。 C沒有指定編譯器如何實現C代碼。可能發生了一對輪班,或者一個面具或一個乘法/劃分。

相關問題