admin管理员组文章数量:1567037
大端 和 小端 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 |
-----------------------
整型寄存器内部的数值并没有大小端之分,只有有符号和无符号的区别。其格式均为从右至左表示逻辑低位到高位
的排布
大小端是相对于存储器数据存储的格式而提出的,高地址字节存放至物理内存的低位被定义为大端;高地址字节存
放至物理内存的高位被定义为小端。小端模式的数据格式
版权声明:本文标题:大端 和 小端(Big-endian和Little-endian ) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1725722903a1038596.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论