大端小端

  • 大端:
* 数据的**低**位保存在内存的**高**地址中,
* 数据的**高**位保存在内存的**低**地址中。
  • 小端:
    • 数据的位保存在内存的地址中,
    • 数据的位保存在内存的地址中。

上面是大小端的定义。定义总是枯燥的,下面来说下我对大小端的理解

为什么要分大小端(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

int main(void)
{
    int a = 0x1;

    if (*(&a) == 1) {
        printf("little endian\n");
    } else {
        printf("big endian\n");
    }

    return 0;
}

在我的机器上打印:little endian

你可能感兴趣的:(大端小端)