对不起来咋回事
按我的理解
布尔值1在(0位),然后是011(3)在第二位,接下来四个未命名洞0000,这样子推理下去满16位就完事了
为什么转化二进制结果是1100110000000001,我单独访问st_view每个成员的值也是跟我想的一样,怎么运行后组合起来就不一样了
联合使用相同的存储空间,那么us_view也等价st_view吧
这个涉及到数据对齐
简单来说,为了提高cpu的寻址效率,结构体并不是你想的那样紧密排列的,中间有空隙
问题:当使用C语言位字段结构初始化后,这些字段的数值如何排序?为什么使用二进制转换后的结果是1100110000000001?为什么每个成员单独访问时它们的值都符合我的想法,但当它们组合在一起时,它们的值却不一样?
回答:使用C语言位字段结构时,在结构体中的每个字段都有一定的位数,按照在结构体定义中的顺序从左到右进行存储。具体来说,在一个字节中,从左到右的每一位都有一个编号,从0到7,如果你需要在一个位字段结构中使用不连续的位,你可以使用冒号空出其他未使用的位。在初始化位字段结构时,它们的数值将按照结构体定义中的顺序从左到右进行排序。
对于使用二进制转换后的结果是1100110000000001的问题,这个数值应该是八位的,但是由于在C语言中,位字段结构不能跨过整个字节边界,所以如果结构体中的所有字段不能完整地填满一个字节,剩余的空间将被填充为0。在这种情况下,剩余的四个未命名的洞会被填充为0,导致最终的排序结果与预期不一致。
以具体的示例来说明,比如你定义一个位字段结构如下:
struct MyStruct { unsigned int first:1; unsigned int second:2; unsigned int third:3; unsigned int unnamed:4; };
假设你初始化MyStruct实例的代码如下:
struct MyStruct example = {1, 3, 6};
那么这个结构体的值将如下所示:
00000110 00000000
这是因为,first字段占用了一个位,并且第一个位为1,second字段占用了两个位,并且它的值为3,third字段占用了三个位,并且它的值为6,而其他未命名的位是空的,并且已经被填充为0。
最后,us_view和st_view使用相同的存储空间联合数据类型(即使用联合体)是否等价?答案是肯定的,因为它们在内存中占用的字节数相同,并且访问它们的方式也都是相同的。例如,在下面的代码中,us_view和st_view具有相同的效果:
union View { unsigned short int us_view; struct { unsigned char first; unsigned char second; } st_view; };
它们都定义了一个联合View,us_view占用了两个字节,st_view占用了两个字节,由于每个字符占用了一个字节,它们占用的相同的存储空间。而且,它们的访问方式也相同,例如,要访问联合的第一个字节,你可以这样写:
union View my_data; my_data.st_view.first = 12; my_data.us_view = 500; // my_data.st_view.first is now 244
这种方式通过使用联合的不同视图来处理数据,可以提高程序的效率和灵活性。