大端模式与小端模式的理解以及判断方法
Posted 非晚非晚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大端模式与小端模式的理解以及判断方法相关的知识,希望对你有一定的参考价值。
1. 为什么会有大端模式和小端模式
在计算机中,我们知道数据是按照字节存储
的,如果数据都是单字节存储,就不涉及存储顺序的问题。但是,大多数情况下,数据不是按照单字节的方式存储的,例如会有类似于int,double等数据类型,这就涉及到存储顺序的问题了,于是也就出现了两种存储方:大端模式(big endian)和小端模式(little endian)
。
我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。
2. 大端模式与小端模式的存储方式
- 大端模式(顺序):高字节在前(高字节存放在地址的低端),低字节在后
- 小端模式:高字节在后,低字节在前
- 大端模式的优点:符号位的判定固定为第一个字节,
容易判断正负
。 - 小端模式的优点:强制转换数据
不需要调整字节
内容
2.1 举例说明一
以0x1234为例进行说明。
地址 | 0x4000(低地址) | 0x4001(高地址) |
---|---|---|
大端存储 | 0x12 | 0x34 |
小端存储 | 0x34 | 0x12 |
2.2 举例说明二
下面来看看数组
在大端模式和小端模式的存储区别,以unsigned int value = 0x12345678进行说明,假设有unsigned char buf[4]的一个数组。
- 大端模式
buf[3] (0x78) – 高地址,存放低位(字节)
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) – 低地址,存放高位(字节)
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
- 小端模式
buf[3] (0x12) – 高地址,存放高位(字节)
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) – 低地址,存放低位(字节)
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
可见,大端模式和字符串的存储模式类似。
3. 用代码判断大端和小端
3.1 union判断
使用union类型共享内存的判断方法。联合体union的存放顺序是所有成员都从低地址开始存放
bool IsBigEndian()
{
union
{
unsigned short a ;//2个字节
char b ;//高地址
} c;
c.a =0x0102 ;
if(c.b ==1)//如果高地址存放低字节
return true ;
else
return false ;
}
3.2 int判断法
直接取int类型的高地址
bool IsBigEndian()
{
int a =1 ;
if(((char*)&a)[3] ==1)//直接取高地址
return true ;
else
return false ;
}
4. Intel格式与Motorola格式
在进行CAN总线通信设计或者测试过程中,经常看到CAN总线信号的编码格式有两种定义:Intel格式与Motorola格式。Motorola是大端字节序,Intel是小端字节序
。
4.1 CAN报文
CAN总线上有4种报文:数据帧、远程帧、错误帧、超载帧。其中只有数据帧真正承载数据。假设报文中含有8各字节的数据,共8*8 = 64 bit
。
- 如果位编号从右至左(R2L),那么:
7 6 5 4 3 2 1 0
--------------------------------
| 0
| 1
| 2
| 3
| 4
| 5
| 6
| 7
- 如果位编号从左至右(L2R),那么:
0 1 2 3 4 5 6 7
--------------------------------
| 0
| 1
| 2
| 3
| 4
| 5
| 6
| 7
这两种编号方式中,字节的编号是一样的,位的编号不同
。CAN报文是串行发送的,CAN节点在发送报文时,不论如何编号,总是从表的左上第一位开始发送。从左至右,从上至下
。
4.2 Intel格式与Motorola格式排列
使用<
或者>
表示信号的衔接点。
- Intel格式
Intel格式的信号的每位,从MSB(高字节)到LSB(低字节),按照从右至左,从上至下的顺序排列(向右上角塞)
x x x x x x x x
--------------------------------
>.. ... ... ... ... ... ... MSB | 0
LSB ... ... ..> | 1
| 2
| 3
| 4
| 5
| 6
| 7
- Motorola格式
而Motorola格式的信号,从MSB(高字节)到LSB(低字节),按照每位从左至右,从上至下排列(向左上角塞)
x x x x x x x x
--------------------------------
MSB ... ... ... ... ... ... ..< | 0
<.. ... ... LSB | 1
| 2
| 3
| 4
| 5
| 6
| 7
从上面可以看出,Motorola格式对can报文的解析更加友好。
以上是关于大端模式与小端模式的理解以及判断方法的主要内容,如果未能解决你的问题,请参考以下文章