关于大端法和小端法

本文深入探讨了字节序(大端法与小端法)在计算机存储数据时的重要性,通过实例展示了如何根据字节序计算内存中存储的数据值,并提供了判断机器字节序的函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

typedef union {
	int  n;
	char p[sizeof(int)];
} union_t;

union_t ut;
memset(&ut,0, sizeof(ut));
ut.p[0] = 13;
printf("%d\n", ut.n);
 

输出结果是什么?

 

 

一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是Little Endian

的。少部分,如MAC OS ,是Big Endian 的。

 

所谓MSB (Most Significant Byte)就是,一个数字中,最重要的那位,

比如,12004,中文读作,一万两千零四,那最高位的1,就表示了一万,此处就称作MSB,最有意义的位.

而LSB (Least Significant Byte)与MSB相反,个位数4就可以称为LSB,

在草稿纸上演算的时候,我们习惯左边写数的MSB,右边写数的LSB。

 

使用Little Endian方式存储数据时,数据的MSB存放在高地址,LSB存放在低地址

比如 0x11223344 ,它在内存中存储为

44 33 22 11 

低地址-->高地址

使用Big Endian方式存储数据时,数据的MSB存放在低地址,LSB存放在高地址

比如 0x11223344 ,它在内存中存储为

11 22 33 44

低地址-->高地址

 

值得注意的是,大端法和小端法讨论的都是字节与字节之间的顺序,至于一个字节内的8个比特,无论大端法还是

小端法,顺序都是一样的,即右边存储低位,左边存储高位。再看一个例子:

 

已知内存中从低地址到高地址存储的4个字节依次是:

11 22 33 44

求这个数是多少?

关键是找出哪头是MSB,哪头是LSB

 

如果该机器是Little Endian,

则低地址存放的是LSB,所以11是LSB,高地址是MSB,所以44是MSB

所以这个数等于

0x44332211

 

如果该机器是Big endian,

则低地址存放的是MSB,所以11是MSB,高地址是LSB,所以44是LSB

0x11223344

 

这个笔试题的意思是,已知内存中从低地址到高地址存储的4个字节是

0D 00 00 00

使用小端法表示,这个数等于0x0000000D,即13。

 

再引申一个问题,试写一个函数判断机器是否为Big Endian。

思想是取一个short数0x1122的第1个字节,若这个字节等于0x11,则是大端法

 

int is_big_endian()
{
	unsigned short test = 0x1122;
	if(*( (unsigned char*) &test ) == 0x11)
		return 1;
	else
		return 0;
}
### 寄存器大端模式与小端模式的差异 在计算机体系结构中,寄存器用于临时存储数据。当涉及到多字节数值时,存在两种不同的存储方式——大端模式小端模式。 #### 大端模式 在这种模式下,较高有效位(MSB)被放置于较低地址处,而较低有效位(LSB)位于较高地址位置。例如,对于一个16位整数值`0x1234`,其高位字节`0x12`会被保存到起始地址,低位字节`0x34`则紧随其后[^2]。 ```c // 假设变量a是一个uint16_t类型的量, 地址为base_address *(volatile uint8_t*)(base_address) = 0x12; // 存储高字节 *((volatile uint8_t*)base_address + 1) = 0x34; // 存储低字节 ``` #### 小端模式 与此相反的是,在小端模式里,最低有效位先存入内存中的较小地址部分;也就是说,上述例子中的`0x34`会写入初始地址,接着才是`0x12`。 ```c // 同样假设变量b也是一个uint16_t类型的量, 地址同样为base_address *(volatile uint8_t*)(base_address) = 0x34; // 存储低字节 *((volatile uint8_t*)base_address + 1) = 0x12; // 存储高字节 ``` ### 应用场景分析 不同场合可能更倾向于使用特定的一种字节序: - **网络传输** 绝大部分互联网标准规定了消息体应按照大端格式发送,这使得跨平台间的通讯更加一致可靠[^3]。因此在网络设备间交换信息时通常会选择大端表示。 - **嵌入式开发** 对于某些微控制器而言,默认可能是固定的小端或是允许通过配置选项切换至大端工作状态。像ARM架构支持动态调整endianness设置,从而适应更多样的需求环境。 - **实时控制系统** 当面对时间敏感的任务处理情况,比如工业自动化领域内的温度监控系统,利用大端编码能够实现更快捷有效的即时反馈机制,有助于提升整体性能表现[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值