2012-09-08 62 views
10
#include <stdio.h> 

int main(){ 
    unsigned char a[4] = {1, 2, 3, 4}; 
    int b = *(int *)&a[0]; 

    printf("%d\n", b); 
    return 0; 
} 

我只是不明白爲什麼b的結果是0x4030201鑄字符陣列整數

有人可以幫我嗎?

+3

'b'不是'0x4030201',你的意思是'int b = *(int *)&a[0];'? –

+1

是的,我打錯了。謝謝。我改變了它 – Learner

+0

你寫的是未定義的行爲。要做到這一點,你應該說:'int b; unsigned char * a =(unsigned char *)&b;'(並且刪除你的行來聲明'b'。) –

回答

1

因爲你的系統是小端。多字節整數中的第一個字節被解釋爲little endian系統中的最低有效字節。

5

您位於小端機器上,這意味着大於一個字節的整數首先存儲最低有效字節。

請注意,現在大多數體系結構都是小端存儲,這要歸功於x86的通用性。

+0

所以如果我使用的是big-endian機器,結果將會是0x1020304? – Learner

+1

@ user1592172是的。 – 2012-09-08 09:20:45

+1

Little-Endian機器首先存儲最不重要的*字節*,而不是位。這是一個錯字嗎? –

13

當你告訴編譯器創建一個這樣的數組:

unsigned char a[4] = {1, 2, 3, 4}; 

這些數字放在某處在內存中按以下順序:

MemoryAddress0: 0x01 -> a[0] 
MemoryAddress1: 0x02 -> a[1] 
MemoryAddress2: 0x03 -> a[2] 
MemoryAddress3: 0x04 -> a[3] 

&a[0]char終場前的值MemoryAddress0並點1個字節值0x01

(int*)&a[0]是種姓d指針具有相同的值MemoryAddress0,但與int*鍵入此時它指向四個連續字節。

我們在日常生活中使用的大多數機器都是little endian這意味着它們將多字節值存儲在內存中,從最低有效字節到最重要字節。

當一個int*指向一個四字節的內存時,它遇到的第一個字節是最不重要的字節,第二個字節是第二個最不重要的字節,依此類推。

MemoryAddress0: 0x01 -> 2^0 term 
MemoryAddress1: 0x02 -> 2^8 term 
MemoryAddress2: 0x03 -> 2^16 term 
MemoryAddress3: 0x04 -> 2^24 term 

因此,4字節的整數值變成0x01*2^0 + 0x02*2^8 + 0x03*2^16 + 0x04*2^24其等於0x04030201

+0

感謝您的詳細解釋... – Learner