快速理解大小端

什么是大端,什么是小端

所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。

所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。


通俗点:对于数字0x1234,按大端模式在内存中排列是 0x12, 0x34;按小端模式在内存中排列是0x34,0x12。


另外:

1.什么是高位:按照 个十百千万 顺序来,即数字从左到右就是由高位到地位。

2.什么是内存低地址/高地址:对于char buf[4],buf的首地址即使低地址,即&buf[3] > &buf[2] > &buf[1] > &buf[0]。

3.CPU处理数字没有大小端之分,在内存上存取数字才会有大小端之分。

4.网络编程中,需要自己设计通讯的协议格式时,传输数字类型一定要采用统一编码方案,例如始终采用大端或者始终采用小端。


### 大小端转换概念 在计算机科学中,大小端(Endianness)指的是多字节数据类型(如整数、浮点数等)存储到内存中的顺序。对于32位整数`num = 0x12345678`而言,在大端模式下,最高有效字节存放在最低地址处;而在小模式下,最低有效字节存放在最低地址处[^1]。 当目标是从大端序转为小序或将小序转为大端序时,即希望将上述例子中的数值变为`num = 0x78563412`。这种变换不仅限于直观上的高低位互换,还涉及到具体硬件架构下的实际操作方式。 ### 实现方法之一:使用联合体判断并转换 利用C/C++语言特性中的联合体结构来处理不同类型的变量共享同一块内存空间这一特点,可以方便地检测系统的当前字节序,并据此执行相应的字节交换逻辑以完成大小端之间的相互转变[^3]: ```cpp union { uint32_t value; char bytes[sizeof(uint32_t)]; } endian_test; endian_test.value = 0x12345678; // 假设初始状态为大端序表示法 // 判断系统默认采用何种字节序... if (/*条件*/) { /*如果是小*/ } else { /*则是大端*/ } for(int i=0;i<sizeof(endian_test.bytes)/2;++i){ std::swap(endian_test.bytes[i], endian_test.bytes[sizeof(endian_test.bytes)-1-i]); } ``` 这段代码通过定义一个联合体成员`value`用于保存原始值而另一个数组型成员`bytes[]`则用来逐个访问组成该值的各个独立字节。接着依据平台特定行为决定是否需要调整这些字节的位置从而达到改变整体编码形式的目的。 ### 使用标准库函数实现 除了手动编写算法外,还可以借助编程环境中已经提供好的工具集简化开发流程。例如,在POSIX兼容的操作系统上运行的应用程序可以直接调用诸如`htonl()`这样的网络字节序转换API来进行高效便捷的大/小切换工作[^4]: ```cpp #include <arpa/inet.h> uint32_t num = 0x12345678; uint32_t swapped_num = htonl(num); // 将主机字节序转换成网络字节序(通常是大端) swapped_num = ntohl(swapped_num); // 反向转换回来 ``` 此段示范展示了如何运用预编译宏和内建功能快速达成预期效果而不必深入理解底层细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值