1. 程式人生 > >大小端模式(詳)

大小端模式(詳)

什麼是大小端模式

大端(儲存)模式:資料的低位儲存在記憶體的高地址中,資料的高位儲存在記憶體的低地址中;
小端(儲存)模式:資料的低位儲存在記憶體的低地址中,資料的高位儲存在記憶體的高地址中。

那麼如何來判斷自己的機器是哪種儲存模式呢?

程式碼一:

#define _CRT_SECURE_NO_WARNINGS 2
#include<stdio.h>
#include<stdlib.h>
union Un
{
	int a;
	char c;
};
int main()
{
	union Un un;
	un.a = 1;               //在聯合體的四個位元組中儲存1,然後輸出最低位元組的內容,是1則小端,是0則大端
	printf("%d\n", un.c);
	system("pause");
	return 0;
}

在聯合體中所有變數共用一塊記憶體單元,首先在聯合體的四個位元組中儲存1,un.a=1;即儲存00000000 00000000 00000000 00000001這一串01序列,然後把un.c輸出出來,即把這四個位元組中地址最低的一個位元組的內容取出來,如果是1,則是小端模式,如果是0則是大端模式! 在這裡插入圖片描述

程式碼二:

#define _CRT_SECURE_NO_WARNINGS 2
#include<stdio.h>
#include<stdlib.h>
int check_sys()
{
	int a = 1;
	return *(char*)&a;     // 取地址預設取最低位元組地址。將整型地址強制轉換為char*型別		                  
	                        //再進行解引用,即取得最低位元組裡面的內容,如果是1,則是小端,0則大端。
}
int main()
{
	int ret = 0;
	ret = check_sys();
	if (1 == ret)
	{
		printf("小端模式\n");
	}
	else if (0==ret)
	{
		printf("大端模式\n");
	}
	system("pause");
	return 0;

程式碼二的原理和程式碼一基本一樣,首先在check_sys函式裡面定義一個整型變數a,為其分配四個位元組,儲存00000000 00000000 00000000 00000001;然後對它進行取地址運算(取得的地址預設是這四個位元組中地址最低的位元組的地址),因此只要我們知道了這個位元組裡面的內容是什麼就可以判斷出這臺機器的儲存模式了! 因為&a是int* 型別的,我們只需取最低位位元組的地址,因此需要強制型別轉換為char*型別,然後再解引用即可取出裡面儲存的值。如果是1,則是小端儲存模式,是0,則是大端儲存模式。