大端小端
2015-11-30 本文已影响101人
河小龙
- 大端:
* 数据的<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