2014-02-23 174 views
0

我認爲我把自己與endianness和bit-shifting混淆了,請幫忙。將8位int轉換爲32位

我有4個8位整數,我想轉換爲32位整數。這是我在做什麼:

uint h; 
t_uint8 ff[4] = {1,2,3,4}; 

if (BIG_ENDIAN) { 
    h = ((int)ff[0] << 24) | ((int)ff[1] << 16) | ((int)ff[2] << 8) | ((int)ff[3]); 
} 
else { 
    h = ((int)ff[0] >> 24) | ((int)ff[1] >> 16) | ((int)ff[2] >> 8) | ((int)ff[3]); 
} 

但是,這似乎產生了一個錯誤的結果。通過一點實驗,我意識到它應該是相反的:在大端序列的情況下,我應該將位移到右側,否則向左移位。但是,我不明白爲什麼。

這就是我的理解。 Big endian意味着最重要的字節在先(第一意味着最左邊,對嗎?也許這是我錯了)。所以,將8位整數轉換爲32位整型會將24個零預置到我現有的8位。所以,爲了使它成爲第一個字節,我需要將位24移到左邊。

請指出我錯在哪裏。

+1

那麼,什麼是'ff [0] >> 24'?用手做,看看結果。這是對的嗎? – hyde

+0

也許試圖與工會做? – AdamF

+0

你說你得到了一個「錯誤的結果」。你得到了什麼結果,這與你的預期有什麼不同? –

回答

3

你總是需要移動剩餘的8位值。但在小端情況下,您必須更改索引的順序,以便第四個字節進入最重要的位置,並將第一個字節轉換爲最不重要的位置。

if (BIG_ENDIAN) { 
    h = ((int)ff[0] << 24) | ((int)ff[1] << 16) | ((int)ff[2] << 8) | ((int)ff[3]); 
} 
else { 
    h = ((int)ff[3] << 24) | ((int)ff[2] << 16) | ((int)ff[1] << 8) | ((int)ff[0]); 
} 
+0

這是否意味着當我將8位int轉換爲32位int時,我總是在左邊得到24個零,與endianness無關? – redFur

+0

是(但僅適用於無符號值,對於帶符號的值,如果值爲負,則可能會得到24 *個* *)。字節順序是關於字節順序,而不是位順序。 – nwellnhof

+1

@IvanInTheHat將8位int轉換爲32位int時,*值*不會更改。所以,如果你把它看作紙上的二進制數,那麼只有你可以添加零而不改變值的確是「ON THE LEFT」。它在一些CPU架構下如何存儲在內存中與它在紙上的外觀或它必須保留的值無關。 – hyde