- 大端:
* 數據的<u>**低**</u>位保存在內存的**高**地址中,
* 數據的<u>**高**</u>位保存在內存的**低**地址中。
- 小端:
- 數據的<u>低</u>位保存在內存的低地址中,
- 數據的<u>高</u>位保存在內存的高地址中。
上面是大小端的定義。定義總是枯燥的,下面來說下我對大小端的理解
為什么要分大小端(Big-endian / Little-endian)?
- 如果數據全是和存儲單元一樣的8bit,就沒有這個問題了,依次存儲就好。
- 對于16-bit和32-bit的數據,這2個和4個單元怎么放呢?先放數據的高位還是低位呢?
- 只有約定一種大家都遵守的規則,數據才能被準確存放和讀取
名稱的來由
一個多字節的數據,比如int,long
, 暫且先將高位叫大端,低位叫小端吧。于是有人做了一個機器,他說,“我這款機器先放大端”,比如ox1234
, 先放0x12
(大端),再放0x34
(小端)。
另有一人做了一款機器,他說,“我的機器先放小端”,比如0x1234
, 先放0x34
(小端),再放0x12
(大端)。
根據存放順序,市面上就出現了兩種類型的機器,分別叫做“先放大端模式”的機器,和“先放小端模式”的機器。后來就簡稱“大端”和“小端”了。
其實,只需要知道這背后是在說一種優先順序就可以了。
看一款機器是大端還是小端
“大端”還是“小端”是由做機器那個人決定的,一臺機器做好,大小端就確定了。
為什么這么說呢? 一款芯片有它確定的指令集,所有高級語言最后都被翻譯為指令集,大小端決定指令集最后怎么被翻譯成電信號。
所以說,不能說c語言采用了大端,java用的小端,因為那是機器本身決定的。
看機器是大端還是小端非常簡單,只需要:
- 將一個2bytes或者以上的數據存為
0x1
- 取先存入的字節(數據的地址處),看是不是1:
- 1 → little-endian
- 0 → big-endian
下面列出c語言代碼:
#include<stdio.h>
int main(void)
{
int a = 0x1;
if (*(&a) == 1) {
printf("little endian\n");
} else {
printf("big endian\n");
}
return 0;
}
在我的機器上打印:little endian