一、定义
- 大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
- 小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。
二、判断方法
1.“截断”
将一个整型变量的值赋给一个字符型变量,通常会发生“截断”,将低8位的一个字节赋值给字符型变量。通过对字符型变量的值进行判断,就可以知道整型变量在内存中的存储模式,进而得知当前的处理器是大端模式还是小端模式。
代码如下:
#include <stdio.h>
int main()
{
int a = 0x11223344;
char b = 0;
b = a;
if(b == 0x44)
printf("Little endian!\n");
else
printf("Big endian!\n");
return 0;
}
2.联合体
利用联合体所有成员共享同一内存位置,只有最后一个被写入的成员能够被正确访问的特点也可以判断当前的处理器是大端模式还是小端模式。关于联合体的具体知识,可以查看这篇文章: 联合体。
代码如下:
#include <stdio.h>
int main()
{
union u
{
int a;
char b;
}c;
c.a = 0x11223344;
if(c.b == 0x44)
printf("Little endian!\n");
else
printf("Big endian!\n");
return 0;
}
三、延伸
在实际项目开发中,会在CAN通讯中遇到与大小端模式类似的Intel
格式和Motorola
格式:
- Intel 格式:
数据的低位保存在低存储字节的低位中,而数据的高位保存在高存储字节的高位中
; - Motorola格式:
数据的低位保存在高存储字节的低位中,而数据的高位保存在低存储字节的高位中
。
注意:
- 当数据刚好为一个字节时,两者的存储方式是相同的*,可以发现这两者格式与大小端存储的定义非常相似,不同的是数据低位仍然存放在低位,只是放在不同存储字节的低位,同理,数据高位仍然存放在高位,只是放在不同存储字节的高位。
- 这主要是因为CAN通信协议的特性所决定的,在CAN通信中在发送数据时会将数据先存放在字节中,然后再将数据发送出去,因此在编写DBC文件解析信号以及信号存储我们要约定好一种格式,这样才可以将信号准确无误的发送和接收。
总结
作为一个嵌入式工程师,我们在驱动开发中配置各种寄存器,经常需要对某个寄存器的几个比特位进行读写操作。不同存储模式的嵌入式设备互联及网络数据传输,也需要考虑大小端模式。因此,掌握大端模式和小端模式的存储方式很有必要。