【正确答案】
【答案解析】C语言的结构体可以实现位段,它的定义形式是在一个定义的结构体成员后面加上冒号,然后是该成员所占的位数。位段的结构体成员必须是int或者unsigned int类型,不能是其他类型。位段在内存中的存储方式是由具体的编译器决定的。
首先,定义位段的长度不能大于存储单元的长度。存储单元是指该位段的类型大小,不是计算机的存储单元字节。其次,一个位段如果不能放在一个存储单元里,那么它会把这个存储单元中剩余的空间闲置,而从下一个存储单元开始存储下一个位段,即一个位段不能存储在两个存储单元内,位段在一个存储单元中的存储是紧凑的。再次,位段名缺省时称作无名位段,无名位段的存储空间通常不用,而位段长度为0位表示下一个位段存储在一个新的存储单元中,位段长度为0的时候位段名必须缺省(不能定义位段名)。最后,一个结构体中既可以定义位段成员也可以同时定义一般的结构体成员。这个时候,一般成员不和位段存储在同一个存储单元中。
程序示例分析如下:
#include<stdio.h>
typedef struct
{
int a:2:
int b:2:
int c:1:
}test;
int main()
{
test t;
t.a=1;
t.b=3;
t.c=1;
printf("%d/n%%d/n%d/n",t.a,t.b,t.c);
return 0;
}
程序输出结果:
1
-1
-1
由于a占两位,而a被赋值为1,二进制就是01,因此%d输出的时候输出1;b也占了两位,赋值为3,二进制也就是11,由于使用了%d输出,表示的是将这个b作为有符号int型来输出,这样的话二进制的11将会有一位被认为是符号位,并且两位的b也会被扩展为int类型,也就是4字节,即32位。其实a也做了这种扩展,只是扩展符号位的时候,由于数字在计算机中存储都是补码形式,因此扩展符号位的时候正数用0填充高位,负数则用1填充高位。因此对于a来说,输出的时候被扩展为00000000 00000000 00000000 00000001,也就是1,而b则扩展为11111111 11111111 11111111 11111111,也就是-1了,c的显示也是这样的。