徹底l理解大端與小端在內存中的關係

大小端的概念在這裏不解釋了,我們直接引用一句很經典的話:

大端模式:高字節保存在內存的低地址中,而數據的低字節保存在內存的高地址中;

小端模式:高字節保存在內存的高地址中,而數據的低字節保存在內存的低地址中;

 

但是看這文字解析是很枯燥的,我們來一步步說明。

首先:我們都知道數據在內存的分佈,棧是往下增長的,堆是往上增長的。也就是:

#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?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章