70,037
社区成员
发帖
与我相关
我的任务
分享
struct a
{
#ifdef big_endian
u8 dev:4;
u8 test:4;
#else
u8 test:4;
u8 dev:4
#endif
};
计算机中最基本的存储单元是0和1,一定要记牢了,对应于C语言的BIT。因此,大小端所谓的存储关系,最基本的单位是bit。
为什么我们通常讨论大小端,说的都是byte?那是因为大部分场景下byte是我们最小的“有意义”的单元。但当BYTE中每一个BIT都有它的含义的时候,就要以bit为最小单元了,LZ举的例子中,四个字节是最小单位,当然,也是要区分大小端的了。有人问,为什么四个bit(比如例子中的test)或者1个byte内部不需要继续细分呢?呵呵,这个自己想想吧,想懂了,这帖就没白看。
通常,在网络协议中,会大量用到这些知识。据我所知,位域没有大小端的区别,区别在于各编译器的实现:
编译器把
struct a
{
u8 test:4;
u8 dev:4
};
中的test放在一个字节的低处还是dev放在低处。
当然:
struct a
{
unsigned short test:15;
unsigned short dev:1
};
形如上面这个位域多于8个的情况,位域的先后顺序依旧是编译器相关的,
但是对于其中的test位域,由于其大于8位,因此它的Bit位是大小端区分的~~~
