大小端的图

https://mp.weixin.qq.com/s/rGtgS9ZoHZQ7fPkzKp-0Tw

另外可以参考我另一篇文章:https://blog.csdn.net/liming0931/article/details/7721390

这篇文章更加仔细:https://mp.weixin.qq.com/s/8UFQDv0D8E_C4TSk-bKskw,强烈推荐!

为何如此强调大小端的原因是,最近用到了数据通信,对于怎么发送,组包等字节就需要了如指掌。否则数据解析是出现问题。

不同大小端的cpu在处理过程中, 是很不一样的,在帝核的公众号中,很详细的讲到这一点,可以说以前仅仅是为了面试,做一下大小端的题目,其实在通信领域,才是大小端非常重要的知识点,也许历史原因吧,各个厂家生产了不同大小端的cpu,才会出现这个情况,但其实历史上,大小端是比较又来头的,可以维基百科一下。

### 关于大小端转换的设计及相关资料 #### 什么是大小端大小端是指计算机存储多字节数据时,按照低位字节(小权端)还是高位字节(大权端)优先存储的方式分类。如果小权端存储在起始地址,则称为小端字节序;反之,如果是大权端存储在起始地址,则称为大端字节序[^1]。 #### 大小端的起源 大小端模式的存在主要是因为不同的硬件架构设计者选择了不同的方式来处理多字节数据的存储问题。这种差异源于历史和技术实现的选择,某些处理器更倾向于一种特定的字节序以便优化性能或简化电路设计[^2]。 #### 数据存储示例 假设有一个短整型数值 `0x1234` 需要存储到内存中: - **大端字节序**下,它会被按顺序存储为 `[0x12, 0x34]`。 - **小端字节序**下,它则会逆序存储为 `[0x34, 0x12]`[^3]。 以下是具体的代码演示如何判断当前系统的字节序: ```c #include <stdio.h> int main() { unsigned int num = 0x12345678; unsigned char *p = (unsigned char *)&num; if (*p == 0x78) { // 如果第一个字节是最低有效字节,则为小端 printf("Little endian\n"); } else if (*p == 0x12) { // 如果第一个字节是最高的有效字节,则为大端 printf("Big endian\n"); } return 0; } ``` 这段程序通过指针访问一个多字节数值的第一个字节,从而判断系统使用的字节序。 #### 如何进行大小端转换? 为了适应不同平台之间的通信需求,通常需要对数据进行大小端转换。常见的方法包括手动逐字节交换或者利用标准库函数完成自动转换。例如,在 C/C++ 中可以使用如下函数来进行网络字节序(通常是大端)与主机字节序间的互转: ```c // 将 short 类型从主机字节序转换成网络字节序 uint16_t htons(uint16_t hostshort); // 将 long 类型从主机字节序转换成网络字节序 uint32_t htonl(uint32_t hostlong); ``` 这些函数内部实现了必要的字节重排逻辑,开发者无需关心具体细节即可正确传输跨平台的数据[^4]。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值