#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
。鑄字符陣列整數
有人可以幫我嗎?
#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
。鑄字符陣列整數
有人可以幫我嗎?
因爲你的系統是小端。多字節整數中的第一個字節被解釋爲little endian系統中的最低有效字節。
您位於小端機器上,這意味着大於一個字節的整數首先存儲最低有效字節。
請注意,現在大多數體系結構都是小端存儲,這要歸功於x86的通用性。
所以如果我使用的是big-endian機器,結果將會是0x1020304? – Learner
@ user1592172是的。 – 2012-09-08 09:20:45
Little-Endian機器首先存儲最不重要的*字節*,而不是位。這是一個錯字嗎? –
當你告訴編譯器創建一個這樣的數組:
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
。
感謝您的詳細解釋... – Learner
'b'不是'0x4030201',你的意思是'int b = *(int *)&a[0];'? –
是的,我打錯了。謝謝。我改變了它 – Learner
你寫的是未定義的行爲。要做到這一點,你應該說:'int b; unsigned char * a =(unsigned char *)&b;'(並且刪除你的行來聲明'b'。) –