众所周知,计算机有两种字节序:大端字节序和小端字节序。
假设一个整数占据4个字节,那么整数1
在小端字节序下的布局应该是0x01 0x00 0x00 0x00,在大端字节序下的布局应该是0x00 0x00 0x00 0x01。
要检查一台计算机是小端字节序还是大端字节序,可以编写以下代码:
int main()
{
int a = 1;
char *p = (char *)&a;
// *p == 1 means little endian, otherwise, big endian
return 0;
}
据我所知,对于小端字节序,*p
被赋值为第一个八位字节:0x01
,而对于大端字节序,则被赋值为 0x00
(以上两个加粗的部分),这就是代码的工作方式。
现在我不太理解不同字节序下位域(bit field)是如何工作的。
假设我们有如下结构体:
typedef struct {
unsigned char a1 : 1;
unsigned char a2 : 1;
unsigned char a6 : 3;
}Bbit;
接下来我们按照以下方式进行任务分配:
Bbit bit;
bit.a1 = 1;
bit.a2 = 1;
这段代码是不是跟具体的实现相关呢?我的问题是,在小端序的情况下,
bit.a1
和bit.a2
的值是否为1
,在大端序的情况下是否为0
?还是说无论大小端序如何,它们的值都一定是1
?
int
大小。 - chux - Reinstate Monicaunsigned char a1: 1;
也缺乏可移植性。 - chux - Reinstate Monicaint
可能与signed int
不同的地方 --> "具体实现未定义,指定符int是指signed int还是unsigned int。"int a1 : 1;
可能编码为-1,0或0,1。 - chux - Reinstate Monica