大小端的概念在這裏不解釋了,我們直接引用一句很經典的話:
大端模式:高字節保存在內存的低地址中,而數據的低字節保存在內存的高地址中;
小端模式:高字節保存在內存的高地址中,而數據的低字節保存在內存的低地址中;
但是看這文字解析是很枯燥的,我們來一步步說明。
首先:我們都知道數據在內存的分佈,棧是往下增長的,堆是往上增長的。也就是:
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
void print_n(void)
{
int n = 0;
printf("n:%p\n", &n);
}
int main(int argc, char *argv[])
{
printf("-------------------stack---------------\n");
int m = 1;
printf("m:%p\n ", &m);
print_n();
printf("-------------------heap---------------\n");
char *x = malloc(4);
char *y = malloc(4);
printf("x:%p y:%p\n", x, y);
free(x);
free(y);
return 0;
}
輸出結果如下:
也就是在我的上述運行中,
可以看到, m比n的內存地址要高, y比x的內存地址要高。這就是我們說的內存地址高低。
接着來看,我們都知道int在內存中佔4個字節;比如 int x = 0x12345678,那麼在內存中如何存放的呢?
如上圖所示:
0x78屬於低位,在左邊的圖中,它存在了低地址,所以這是小端模式;
同理:在右邊的圖中,0x78存在高地址中,所以這是大端模式;
我們編碼驗證一下:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int x = 0x12345678;
char *p = (char *)&x;
if(*p = 0x78)
printf("little endian!\n");
else if(*p = 0x12)
printf("big endian!\n");
else
printf("error!\n");
return 0;
}
輸出結果如下:
我們可以進一步驗證一下,通過都可執行文件頭來判斷大小端:
Do you understand?