一、什么是大小端模式
- 大端模式(big endian)和小端模式(little endian)。
- 在串口等串行通信中懊烤,一次只能發(fā)1個字節(jié)梯醒。這個時候遇到一個問題。int類型有4個字節(jié)腌紧。我們是按照什么順序發(fā)送字節(jié)呢茸习。發(fā)送方和接收方必須按照同樣的字節(jié)順序來通信。這就是通信系統(tǒng)中的大小端模式壁肋。
- 現(xiàn)在我們講的大小端模式講的更多的是計算機存儲系統(tǒng)的大小端号胚。在計算機內(nèi)存/硬盤/Nnad中.因為存儲系統(tǒng)是32位的,但數(shù)據(jù)仍然按照字節(jié)為單位,于是一個32位的二進制在內(nèi)存中存儲時有兩種分布方式。
- 高位低位浸遗,高地址低地址猫胁。
- 高位對應(yīng)高地址:大端存儲模式。
- 高位對低地址:小端存儲模式跛锌。
- 大端模式和小端模式本身沒有好壞弃秆。但必須要求存儲和讀取時按照同樣的大小端模式,否則會出錯髓帽。
- 現(xiàn)實是有些cpu公司用大端(c51)菠赚,有些用小端(arm、intal)郑藏。大部分用小端锈至,大端模式的不是很多。當(dāng)不知道當(dāng)前環(huán)境是用大端還是小端译秦,就需要用代碼檢測當(dāng)前系統(tǒng)的大小端峡捡。
二、用union來測試機器的大小端
- a和b都是從低地址開始訪問的筑悴。
- 假設(shè)u1所在的4字節(jié)地址分別是0123们拙,a自然是0123;b所在的地址是0而不是3阁吝。
- 代碼后面不能定義變量砚婆。
#include <stdio.h>
union myunion
{
int a;
char b;
};
int is_little_ending(void)
{
union myunion u1;
u1.1=1;
return u1.b;
}
int main(void)
{
int i=is_little_ending(void);
if(i==1)
{
printf("小端模式.\n")
}
else
{
printf("大端模式.\n")
}
return 0;
}
三、用指針方式來測試機器的大小端
#include <stdio.h>
int is_little_ending(void)
{
int a=1;
char b=*((char *)&a);
return b;
}
int main(void)
{
int i=is_little_ending(void);
if(i==1)
{
printf("小端模式.\n")
}
else
{
printf("大端模式.\n")
}
return 0;
}