user-0 提问: 结构体的问题

回复:
user: user-1
content: 引用 楼主 qq_34010404 的回复:struct BYTE {  unsigned bit1:1;  unsigned bit2:1;  unsigned bit3:1;  unsigned bit4:1;  unsigned bit5:1;  unsigned bit6:1;  unsigned bit7:1;  unsigned bit8:1; };  这个BYTE的大小为什么不是1] 把unsigned改成char就是1了。

user: user-2
content: 结构体对齐、指针强转概念不清 引用 4 楼 qq_34010404 的回复:[quote=引用 1 楼 user-6的回复:][quote=引用 楼主 qq_34010404 的回复:] struct BYTE {  unsigned bit1:1;  unsigned bit2:1;  unsigned bit3:1;  unsigned bit4:1;  unsigned bit5:1;  unsigned bit6:1;  unsigned bit7:1;  unsigned bit8:1; };  这个BYTE的大小为什么不是1] 结构体在编译之后会调整内存对齐，也就是硬件寻址的基本单位，比如32位电脑,那就是四字节对齐，这样的目的是为了更快的寻址，提高读取数据的效率，这个可以在编译时修改参数来调整，如果不调整的情况下，32位应用程序结构中的默认为4字节对齐，不过看你这个编码应该不是32位的，应该是单片机的[/quote] BYTE*p; char a=100; p=(BYTE*)&a; p-b>it1......这样为什么能把a的八个位都取出来?[/quote]

user: user-3
content: unsigned char不行吗？ 一位的话，signed char取值-1，0 unsigned char取值0，1

user: user-4
content: unsigned即unsigned int，无论在32位机器或是64位机器，都是占用4字节。 结构体BYTE用了8个位域，每个位域分别占用1位，总共占用1个字节，但是结构体内存对齐会使BYTE占用4个字节

user: user-2
content: unsigned大小是4，在怎么用位域，大小还是4

user: user-0
content: 引用 7 楼 轻箬笠的回复:[quote=引用 楼主 qq_34010404 的回复:] struct BYTE {  unsigned bit1:1;  unsigned bit2:1;  unsigned bit3:1;  unsigned bit4:1;  unsigned bit5:1;  unsigned bit6:1;  unsigned bit7:1;  unsigned bit8:1; };  这个BYTE的大小为什么不是1] 把unsigned改成char就是1了。 [/quote] 改成char真变成1了

user: user-0
content: 引用 6 楼 636f6c696e的回复:结构体对齐、指针强转概念不清 [quote=引用 4 楼 qq_34010404 的回复:] [quote=引用 1 楼 user-6的回复:][quote=引用 楼主 qq_34010404 的回复:] struct BYTE {  unsigned bit1:1;  unsigned bit2:1;  unsigned bit3:1;  unsigned bit4:1;  unsigned bit5:1;  unsigned bit6:1;  unsigned bit7:1;  unsigned bit8:1; };  这个BYTE的大小为什么不是1] 结构体在编译之后会调整内存对齐，也就是硬件寻址的基本单位，比如32位电脑,那就是四字节对齐，这样的目的是为了更快的寻址，提高读取数据的效率，这个可以在编译时修改参数来调整，如果不调整的情况下，32位应用程序结构中的默认为4字节对齐，不过看你这个编码应该不是32位的，应该是单片机的[/quote] BYTE*p; char a=100; p=(BYTE*)&a; p-b>it1......这样为什么能把a的八个位都取出来?[/quote][/quote] BYTE大小是4，为什么能指向一个一字节大小的变量，而且每个成员都对应一字节变量的每一位

user: user-5
content: unsigned默认是unsigned int类型，所以得到的结果应该是sizeof(unsigned int)的值。

user: user-3
content: 仅供参考：#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("AD sizeof %d\n", sizeof(AD));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("A1 sizeof %d\n", sizeof(A1));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("A2 sizeof %d\n", sizeof(A2));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("A4 sizeof %d\n", sizeof(A4));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("A8 sizeof %d\n", sizeof(A8));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("A16 sizeof %d\n", sizeof(A16));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 //AD sizeof 32 // //A1.a 0 //A1.b 4 //A1.c 17 //A1 sizeof 25 // //A2.a 0 //A2.b 4 //A2.c 18 //A2 sizeof 26 // //A4.a 0 //A4.b 4 //A4.c 20 //A4 sizeof 28 // //A8.a 0 //A8.b 4 //A8.c 24 //A8 sizeof 32 // //A16.a 0 //A16.b 4 //A16.c 24 //A16 sizeof 32 // //

user: user-6
content: 结构体指针 ->就代表指向成员的偏移，有指针，有偏移，有成员类型，肯定可以取出来了

user: user-0
content: 引用 1 楼 user-6的回复:[quote=引用 楼主 qq_34010404 的回复:] struct BYTE {  unsigned bit1:1;  unsigned bit2:1;  unsigned bit3:1;  unsigned bit4:1;  unsigned bit5:1;  unsigned bit6:1;  unsigned bit7:1;  unsigned bit8:1; };  这个BYTE的大小为什么不是1] 结构体在编译之后会调整内存对齐，也就是硬件寻址的基本单位，比如32位电脑,那就是四字节对齐，这样的目的是为了更快的寻址，提高读取数据的效率，这个可以在编译时修改参数来调整，如果不调整的情况下，32位应用程序结构中的默认为4字节对齐，不过看你这个编码应该不是32位的，应该是单片机的[/quote] BYTE*p; char a=100; p=(BYTE*)&a; p-b>it1......这样为什么能把a的八个位都取出来?

user: user-6
content: 引用 楼主 qq_34010404 的回复:struct BYTE {  unsigned bit1:1;  unsigned bit2:1;  unsigned bit3:1;  unsigned bit4:1;  unsigned bit5:1;  unsigned bit6:1;  unsigned bit7:1;  unsigned bit8:1; };  这个BYTE的大小为什么不是1] 结构体在编译之后会调整内存对齐，也就是硬件寻址的基本单位，比如32位电脑,那就是四字节对齐，这样的目的是为了更快的寻址，提高读取数据的效率，这个可以在编译时修改参数来调整，如果不调整的情况下，32位应用程序结构中的默认为4字节对齐，不过看你这个编码应该不是32位的，应该是单片机的