2011-09-21 76 views
3

我在閱讀關於Big/Little Endian的文章時感到困惑。整數如何存儲在內存中?

代碼低於:

#include <iostream> 
using namespace std; 

int i = 12345678; 

int main() 
{ 
    char *p = (char*)&i; //line-1 

    if(*p == 78) //line-2 
     cout << "little endian" << endl; 
    if(*p == 12) 
     cout << "big endian" << endl; 

} 

問:

  1. 在線路1,我所能做的使用static_cast<char*>(&i)轉換?

  2. 在第2行中,根據代碼,如果是little-endian,則78存儲在最低字節中,否則12存儲在最低字節中。但我認爲,i = 12345678;將以二進制形式存儲在內存中。

    如果是小端,那麼i的二進制的最後一個字節將存儲在最低字節中,但我不明白的是它如何保證i的最後一個字節是78

    就像,如果i = 123;,然後i的二進制是01111011,它可以保證在小端,23存儲在最低字節?

+1

您的代碼將失敗,因爲你混淆了十進制和十六進制。用'0x'前綴你的號碼,它會起作用。 –

+2

您可能意思是:'int i = 0x12345678;' –

回答

9
  1. 我寧願一個reinterpret_cast

  2. 小端和大端參考方式字節,即8位數量時,存儲在存儲器中,不是兩位小數量。如果i的值爲0x12345678,那麼您可以檢查0x780x12以確定字節順序,因爲兩個十六進制數字對應於單個字節(在我編程的所有硬件上)。

+0

您可以展開「檢查0x78和0x12以確定排序」嗎? – 2011-09-21 12:09:07

+0

如果'i'是十六進制的,那麼0x12 0x34 0x56 0x78將分別佔用一個字節? – Alcott

+0

@CodeMonkey:現在清楚了嗎? –

1
  1. static_cast是一個新型替代老式的C-風格轉換,但在這裏並不合適; reinterpret_cast適用於完全更改數據類型的情況。

  2. 這段代碼根本行不通 - 字節不包含偶數個小數位!十進制數字的數字與存儲器中存儲的字節不一致。例如,十進制數500可以作爲0x01F4存儲在兩個字節中。 「01」代表256,「F4」代表另一個244,總數爲500.你不能說「500」中的「5」是這兩個字節中的任何一個 - 沒有直接的對應關係。

+0

不包含偶數的小數位數?我不太瞭解先生。 – Alcott

+0

它似乎我不能使用'static_cast',因爲我得到一個錯誤「錯誤:從類型'int *'無效static_cast類型'char *'」。 – Alcott

+2

'static_cast'用於相關類型之間的轉換。 'reinterpret_cast'用於任意指針類型之間的轉換。 –

0

應該

unsigned char* p = (unsigned char*)&i; 

不能使用的static_cast。只有reinterpret_cast。

+1

此外,你*不能*使用靜態轉換。 –

4

有兩個不同的概念,參與在這裏:

  1. 號碼存儲在二進制格式。8位代表一個字節,整數可以使用1,2,4甚至8或1024個字節,具體取決於它們運行的​​平臺。
  2. 字節序是順序字節具有在存儲器(以下顯著第一 - LE,或最顯著第一 - BE)現在

,12345678是一個十進制數,其二進制(BASE2)表示是101111000110000101001110.不容易主要是因爲base2表示不能精確地分組到一個十進制數字中。 (沒有整數x,所以2 x給出10)。 十六進制數是適合的easyer:2 = 16和2 = 16 = 256。

所以十六進制數字0x12345678形成字節0x12-0x34-0x56-0x78。 現在很容易檢查第一個是0x12還是0x78。

(注:12345678十六進制表示是0x00BC614E,其中0xBC是188,0x61是97和0x4E 78)