user-0 提问: 大端小端对位域成员存放的影响

回复:
user: user-1
content: 许多码农这辈子都没用过WinHex

user: user-2
content: 字节序分为大端字节序和小端字节序，通常网络传输数据时候，因为两端的机器平台可能不一样，所以会字节序问题。 大端字节序说通俗一点：即低地址，高字节 小端字节序说通俗一点：即低地址，低字节 楼主不明白字节序是怎么回事，首先说明楼主对于，高地址与低地址，高字节与低字节，还不是很了解。 多字节对象存储在连续的字节序列，对象地址为所使用字节中最小的地址， 如int a的地址为0x100,则a的四个字节存储在0x100,0x101,0x102,0x103的位置 对于高低地址问题，地址数值大的即为高地址，地址数值小的即为低地址，如上例中0x100为低地址，0x103为高地址 对于高低字节问题，高字节在左，低字节在右，例如0x01234567，高字节为0x01，低字节为0x67 所以对于0x01234567的存储，假设其存在0x100起始的地址上，总共占据4字节                              0x100     0x101     0x102     0x103  大端字节序           01             23           45           67             即低地址0x100存放高字节0x12 小端字节序            67             45           23           01             即低地址0x100存放低字节0x67  一般的测试程序 int main() {       int a = 0x12345678;       char b = (char)a;//强制类型转换，将int类型转换为char型，即取变量a低地址部分       if(a == 0x78)           printf("小端\n");//低地址，存放低字节，即小端       if(a == 0x12)           printf("小端\n");//低地址，存放高字节，即大端       return 0; }   希望能帮到你。

user: user-3
content: 把内存编辑器打开看看一个整型是怎么保存的 大端小端问题常见于linux和windows平台之间的位串信息交互，很多时候需要倒置，其余倒是一般不用注意

user: user-4
content: c11 draft N1570  11 An implementation may allocate any addressable storage unit large enough to hold a bit-field. If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit. If insufficient space remains, whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is implementation-defined. The order of allocation of bit-fields within a unit (high-order to low-order or low-order to high-order) is implementation-defined. The alignment of the addressable storage unit is unspecified.  位域的大多数实现细节都是实现相关的。所以即便同是大段或者小段的处理器，位域怎么存都依赖与编译器的实现。

user: user-1
content: 理解和讨论之前请先学会如何观察！  #include <stdio.h> #pragma pack(push,1) union U {     unsigned char byte;     struct BF {         unsigned int b0:1;//a         unsigned int b1:1;//b         unsigned int b2:1;//c     } bf; } u; #pragma pack(pop) unsigned char bt; int a,b,c; int main() {     for (bt=0;bt<8;bt++) {         u.byte=(unsigned char)bt;         a=u.bf.b0;         b=u.bf.b1;         c=u.bf.b2;         printf("byte 0x%02x -- c:%d b:%d a:%d\n",bt,c,b,a);     }     for (c=0;c<2;c++)     for (b=0;b<2;b++)     for (a=0;a<2;a++) {         u.bf.b0=a;         u.bf.b1=b;         u.bf.b2=c;         bt=u.byte;         printf("c:%d b:%d a:%d -- byte 0x%02x\n",c,b,a,bt);     }     return 0; } //byte 0x00 -- c:0 b:0 a:0 //byte 0x01 -- c:0 b:0 a:1 //byte 0x02 -- c:0 b:1 a:0 //byte 0x03 -- c:0 b:1 a:1 //byte 0x04 -- c:1 b:0 a:0 //byte 0x05 -- c:1 b:0 a:1 //byte 0x06 -- c:1 b:1 a:0 //byte 0x07 -- c:1 b:1 a:1 //c:0 b:0 a:0 -- byte 0x00 //c:0 b:0 a:1 -- byte 0x01 //c:0 b:1 a:0 -- byte 0x02 //c:0 b:1 a:1 -- byte 0x03 //c:1 b:0 a:0 -- byte 0x04 //c:1 b:0 a:1 -- byte 0x05 //c:1 b:1 a:0 -- byte 0x06 //c:1 b:1 a:1 -- byte 0x07

user: user-5
content: 这根 Bit 序 和 Bytes序 都有关系  C标准没有规定 Bits顺序和位段声明顺序的关系. 这样，也就无法规定 Bytes 顺序和 字节顺序的关系了

user: user-6
content: 并不是大小端的问题，而是这东西是implementation-defined behavior。即便都是小端，两个编译器上也可能不一样。

user: user-0
content: 例如这个一个例子中各位在内存中是怎么分布的？     struct     {          short bit1:4          short bit2:9          short bit3:3     };

user: user-0
content: 就是不怎么懂大端小端对位域成员存放的影响

user: user-7
content: int main(void) { 	int n = 0x12345678; 	char *p = (char*)&n; 	printf("%x %x %x %x\n", p[0], p[1], p[2], p[3]); 	return 0; } //78 56 34 12小端 //12 34 56 78大端