2014-01-18 80 views
0

在下面的代碼中,我試圖在2 char s中存儲一個2字節的int。然後,我嘗試在屏幕上顯示我存儲的號碼。這些部分工作得很好。爲什麼這些位反轉了?

如果我試圖看到我存儲在另一方面的數字的二進制形式,我沒有得到我所期望的。 256給我00000000 1而正確的是10000000 0

unsigned int num = 256; 
unsigned int pos = 0; 

unsigned char a[2] = {num << pos, ((num << pos) & 0xFF00) >> 8}; 
//we store the number in 2 bytes 

cout << (((unsigned int)a[0] + ((unsigned int)a[1] << 8)) >> pos) << endl; 
//we check if the number we stored is the num 

for(int i = 0; i < 2; i++)//now we display the binary version of the number 
{ 
    for(int j = 0; j < 8; j++) 
     cout << ((a[i] >> j)&1); 
    cout << " "; 
} 

能有人請解釋什麼,我做錯了什麼?

+1

你內在的'for'循環最不重要。 – user2357112

+0

你在做錯誤的數學。 '256'是'0x 1 0000 0000' – qwm

+0

@ user2357112:是否有其他錯誤? qwm:我不明白? – Luka

回答

1
unsigned char a[2] = {num << pos, ((num << pos) & 0xFF00) >> 8}; 

表示您將低位存儲在[0]中,將高位存儲在[1]中。

256 = 1 00000000 
a[0] = 00000000 
a[1] = 00000001 

而且for(int j = 0; j < 8; j++)(至少顯著位第一)應for(int j = 7; j >=0; j--)(最顯著比特第一)

1

變化:

cout << ((a[i] >> j)&1); 

要:

cout << ((a[i] >> (8-j-1))&1); 

或更改:

for(int j = 0; j < 8; j++) 

要:

for(int j = 8-1; j >= 0; j--) 
+0

如果我做你在那裏寫的東西,我沒有得到預期的結果。如果我將'i'循環更改爲'for(int i = 1; i> = 0; i - )'爲什麼會發生這種情況,我會得到正確的結果? – Luka

1

號碼被存儲在存儲器與至少顯著位第一。

想想這樣:數字456在10^0位置有6個,在10^1位置有5個,等等。將它存儲爲「654」(其中字符串的字符對應於第10 ^第i位數字)。

計算機以相同的方式存儲數字:數字的第一位表示第2位,第i位表示第2位。

這個規則實際上是用Big Endian來破解的,這是一種在內存中從最大到最小(人類可讀的方式)存儲十六進制數字的方法。

+0

這是不正確的,不是問題的原因。沒有明確定義的「第一位」字節,而今天,小型和大型系統都被廣泛使用。 – user2357112

+0

我從來沒有見過任何第一位MSB的參考,所以這似乎過於迂腐。按照我所知的流行慣例,LSB是第一位。我這樣解釋它是因爲我認爲提問者對位的順序有一個直觀的想法,如果相反,它會給出正確的結果。 – leewz

+0

啊,PowerPC使用MSB 0。 – leewz

相關問題