大端与小端

发布时间:2026/7/10 13:00:16

大端与小端 1. 端模式起源端模式 (Endian) 起源于《格列佛游记》书中根据鸡蛋敲开的方式不同将所有人分为2类从圆头开始敲的人被归为 Big Endian从尖头开始敲的被归为 Little Endian。小人国的内战就是源于吃鸡蛋是是究竟从大头 (Big-Endian) 敲开还是从小头 (Little-Endian) 敲开。2. 大小端定义大端高地址存低字节低地址存高字节小端低地址存低字节高地址存高字节人类读写数据习惯是大端字节序大数据先读小数据后读。所以小端是反人类的方式3. 为什么有大小端计算机业界的Endian表示数据在存储器中的存放顺序。我们的编程语言定义了 charshortint等各种类型每一种类型占用的字节大小为124等。而我们的处理器的寄存器的宽度大于一个字节那么必然存在将多字节类型数据存入寄存器的顺序问题。例如数字12345678在寄存器大端存储顺序数字12345678在寄存器小端存储顺序由此可见CPU的大小端是有硬件架构决定的。常见的处理器大小端架构处理器端模式IntelX86Little-EndianPower-PCBig-EndianIBMBig-EndianARM默认 Little-EndianSTM32Little-Endian网络通讯协议采用的是Big-Endian4. 谁更好小端模式强制类型转换数据不需要调整字节内容。大端模式符号位判断固定为第一个字节容易判断正负便于人类阅读。总结大小端没有谁更优更劣各种优点就是对方劣势。5. 如何代码判断大小端#include QCoreApplication #include QDebug bool isLittleEndian(){ unsigned short a 0x1218; if ( (*(char*)a) 0x18){ return true; } else { return false; } } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); if (isLittleEndian()) { qDebug() LitteEndian; } else { qDebug() BigEndian; } return a.exec(); }6. 大小端转换代码6.1. 使用宏转换#define BigLittleSwap16(A) ((((uint16)(A) 0xff00) 8) | \ (((uint16)(A) 0x00ff) 8)) #define BigLittleSwap32(A) ((((uint32)(A) 0xff000000) 24) | \ (((uint32)(A) 0x00ff0000) 8) | \ (((uint32)(A) 0x0000ff00) 8) | \ (((uint32)(A) 0x000000ff) 24))6.2. 使用函数转换大端转小端templateclass T T ConvertBigEndToLittleEnd(T big_end_value) { T little_end_value(0); int num sizeof(T); for (int i 0; i num; i) { little_end_value little_end_value 8; little_end_value | (big_end_value 0xFF); big_end_value big_end_value 8; } return little_end_value; }参考文献一文彻底弄懂大端与小端_kingforyang的博客-CSDN博客_大端小端C/C 大小端转换_HHT0506的博客-CSDN博客_c 大小端转换大小端及转换(C)_休息一下接着来的博客-CSDN博客_大小端转换

相关新闻