admin管理员组

文章数量:1530046

大端 和 小端 Big-endian和Little-endian

flyfish
2015-7-25 初稿
2023-05-26 增加代码
2023-06-15 增加详图

引用自《深入理解计算机系统》的说法
最高有效字节在最前面的方式,称为大端法(big endian)
最低有效字节在最前面的方式,称为小端法(little endian)

引用自《Computer Systems A Programmer’s Perspective》的说法
where the most significant byte comes first—is referred to as big endian.
where the least significant byte comes first—is referred to as little endian.

引用自wiki的说法
Big-endian systems store the most-significant byte of a word at the smallest memory address and the least significant byte at the largest.
A little-endian system, in contrast, stores the least-significant byte at the smallest address.

“端”(endian)的起源(Aside Origin of “endian”)

以下是Jonathan Swift在1726年关于大小端之争历史的描述:

我下面要告诉你的是,Lilliput和Blefuscu这两大强国在过去36个月里一直在苦战。战争开始是由于以下的原因:我们大家都认为,吃鸡蛋前,原始的方法是打破鸡蛋较大的一端,可是当今皇帝的祖父小时候吃鸡蛋,一次按古法打鸡蛋时碰巧将一个手指弄破了,因此他的父亲,当时的皇帝,就下了一道敕令,命令全体臣民吃鸡蛋时打破鸡蛋较小的一端,违令者重罚。老百姓们对这项命令极为反感。历史告诉我们,由此曾发生过6次叛乱,其中一个皇帝送了命,另一个丢了王位。这些叛乱大多都是Blefuscu的国王大臣们煽动起来的。叛乱平息后,流亡的人总是逃到那个帝国去寻救避难。据估计,先后几次有11
000人情愿受死也不肯去打破鸡蛋较小的一端。关于这一争端,曾出版过几百本大部著作,不过大端派的书一直是受禁的,法律也规定该派的任何人不得做官。”(此段译文摘自网上蒋剑锋译的《格列佛游记》第一卷第4章。)

在他那个时代,Swift是在讽刺英国(Lilliput)和法国(Blefuscu)之间持续的冲突。Danny
Cohen,一位网络协议的早期开创者,第一次使用这两个术语来指代字节顺序[25],后来这个术语被广泛接纳了。

一个32位的整数0x12345678 Big-endian和Little-endian的表示

#include <iostream>

int main() {

    u_int32_t variable = 0x12345678;
    std::cout << "变量是0x" << std::hex << variable << std::endl;
    std::cout << "变量大小是 " << sizeof(variable) << " bytes\n";
    std::cout << "变量地址是 " << &variable << std::endl;


    unsigned char *pointer = (unsigned char *)&variable;


    std::cout << "-----------------------\n";
    for (int i = 0; i < 4; i++) {
        std::cout << "| " << (unsigned int *)pointer << " | ";
        std::cout << (unsigned int)*pointer << " |\n";
        pointer++;
    }
    std::cout << "-----------------------\n";
}
变量是0x12345678
变量大小是 4 bytes
变量地址是 0x7ffc91165688
-----------------------
| 0x7ffc91165688 | 78 |
| 0x7ffc91165689 | 56 |
| 0x7ffc9116568a | 34 |
| 0x7ffc9116568b | 12 |
-----------------------

整型寄存器内部的数值并没有大小端之分,只有有符号和无符号的区别。其格式均为从右至左表示逻辑低位到高位
的排布

大小端是相对于存储器数据存储的格式而提出的,高地址字节存放至物理内存的低位被定义为大端;高地址字节存
放至物理内存的高位被定义为小端。小端模式的数据格式

本文标签: 大端BigEndian