众所周知,我们有两种字节序:大字节序和小字节序。
假设整数占用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
大端(上面两个粗体部分),代码就是这样工作的。
现在,我不太了解位域在不同字节序下的工作方式。
假设我们有这样一个结构:
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
and的值bit.a2
是否1
在小端上,0
在大端上?还是绝对不1
考虑它们的字节序?
假设我们有一个结构:
typedef struct {
unsigned char a1 : 1;
unsigned char a2 : 1;
unsigned char a6 : 3;
}Bbit;
和一个定义:
Bbit byte;
假设byte
存储在单个字节中,并且当前被清零:0000 0000
。
byte.a1 = 1;
这会将称为的位设置a1
为1
。如果a1
是第一位,则byte
变为1000 0000
,如果a1
是第五位,则byte
变为0000 1000
,如果a1
是第八位,则byte
变为0000 0001
。
byte.a2 = 1;
这会将称为的位设置a2
为1
。如果a2
是第二位,则byte
(可能)变为1100 0000
,但如果a2
是第六位,则byte
(可能)变为0000 1100
,如果a2
是第七位,则byte
变为0000 0011
。(这些只是“可能的”,因为不能保证这些位遵循某种合理的顺序。编译器不太可能搞乱这个示例。)
对于存储的值,字节序不是一个因素。每次分配仅更改代表指定位字段的位,并且将分配的值减少到该位数(如果实现值对于该位数而言太大,则使用实现定义的行为)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句