目录
I字节序
在不同的cpu类型中,存储超过一字节数据的顺序可能有所不同(部分cpu可指定字节序),根据高字节存放在低地址或高地址将字节序分为以下两种:大端序、小端序。根据数据所在位置不同,可以分为以下两种:网络序(对应大端序,数据在网络传输规定的字节序)、主机序(根据cpu类型确定的字节序,对应大端/小端序,数据在系统中的字节序)。
- 大端序
- 高字节存放在低地址,低字节存放在高地址
- 符合平时的书写习惯,如0x0402,04为高字节,存放在低地址,02为低字节,存放在高地址
- 为了不同cpu的数据交互,在网络中传输中统一使用大端序,即网络序
- 小端序
- 数据传输
Question:
- 变量为一字节时,无需转字节序。大端/小端系统在读取比特数据时,是不是默认从左至右为低地址->高地址/高地址->低地址?
II位域序
Question:
- 位域在一字节内,以bit为单位,一字节内需调换变量顺序(反序)。
- 位域超过一字节,且各位域偏移量不是8bit的倍数,调换顺序。
- 位域超过一字节,且各位域偏移量是8bit的倍数,每8bit内调换顺序即可。
与变量u16 A的字节序转换规则不同,A是一个整体,单位为Byte,abca1b1c1单位为bit且在一个字节内转换
#ifdef defined(__BIG_ENDIAN_BITFIELD)
u16 a:4
b:3
c:1
a1:5
b1:1
c1:2
#elif defined(__LITTLE_ENDIAN_BITFIELD)
u16 c:1
b:3
a:4
c1:2
b1:1
a1:5