❶ c语言结构体位域问题
不是的,结构体变量只是整个结构体存储的首地址,每个位域没有具体规定大小,所以整个结构体也没有规定大小,要看你定义的位域的类型。例如8个int型位域和8个double型位域存储空间是不一样的
❷ 请教一个关于C/C++位域问题
谭浩强的书。。。
首先,位域类型并不限于unsigned或int,只不过它们应用比较多,因为结构体在内存中一般是按照4字节对齐的。但是也可能只需要大小不超过4字节的结构体,那么int就显得不合适了。
楼下那位“什么int,short都是没有作用的”说的并不对,就像你举得这个例子中,如果把unsigned short都改为 unsigned int,那么最终sizeof()的结果就与原来不符
❸ 解释下位域,为什么要用位域,位域的好处
位域是指信息在存储时,并不需要占用一个完整的字节,
而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1
两种状态,
用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段"。所谓"位域"是把一个字节中的二进位划分为几
个不同的区域,
并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。
这样就可以把几个不同的对象用一个字节的二进制位域来表示。
使用位域的好处是:
1.有些信息在存储时,并不需要占用一个完整的字节,
而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1
两种状态,
用一位二进位即可。这样节省存储空间,而且处理简便。
这样就可以把几个不同的对象用一个字节的二进制位域来表示。
2.可以很方便的利用位域把一个变量给按位分解。比如只需要4个大小在0到3的随即数,就可以只rand()一次,然后每个位域取2个二进制位即可,省时省空间。
❹ C语言中位域大小与宽度该怎么算
1 8;
分析第一个: 在结构体里 他使用了位域 然后 a使用了2位 b使用了3位 c使用了3位 这里刚好用掉了8位 一共是一个字节 然后在对结构体分析 结构体里只有unsigned char类型 这个类型占了一个字节 然后 然后结构体的大小必须是结构体里最长的类型的整数倍 这里面就是1的整数倍 然后结合上面用了1字节 所以结果是1
分析第二个: 2 3 3一样的和上面, 然后里面多一个unsiged int 这个东西在里面占用4个字节 那么结构体的大小就必须是4的倍数 然后里面存取的结果就是 a 2位 b 3位 c 3位 然后这是一个字节 然后与unsiged int对其 空出3个字节补0; 然后放一个d; 然后d前四位有数 后面补0;
❺ c语言 关于位域的使用
一、位域
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:
struct 位域结构名
{ 位域列表 };
其中位域列表的形式为: 类型说明符 位域名:位域长度
如
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:
1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*从下一单元开始存放*/
unsigned c:4
}
在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*该2位不能使用*/
int b:3
int c:2
};
从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。
二、位域的使用
位域的使用和结构成员的使用相同,其一般形式为: 位域变量名·位域名 位域允许用各种格式输出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit->a=0;
pbit->b&=3;
pbit->c|=1;
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}
上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。
程序的9、10、11三行分别给三个位域赋值。( 应注意赋值不能超过该位域的允许范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&=", 该行相当于: pbit->b=pbit->b&3位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为3)。同样,程序第16行中使用了复合位运算"|=", 相当于: pbit->c=pbit->c|1其结果为15。程序第17行用指针方式输出了这三个域的值。
❻ 单片机的位域是什么意思如何使用
标准C提供了一种基于结构体的数据结构--位域(BitField),位域就是把一个
存储单元
中的
二进制
划分为几个不同的区域。并说明每个区域的
位数。每一个域有一个
域名
,允许在
程序
中按域名进行操作,位域的定义格式如下:
struct
位域结构名{
位域列表
};
位域列表格式为:类型说明符
位域名:位域长度如:
struct
k{
unsigned
int
a:1
unsigned
int
:2
unsigned
int
b:3
unsigned
int
:0
//空域
}k1;
说明:
1)各位依次从低位到高位排列,排满一个存储单元,按地址接着排下一单元;
2)位域可以无域名,但不能被引用,如
第二域
,这时其只用来填充或调整位置;
3)第四行称空域,目的是将目前存储单元的剩余部分分为一个域,且填充0。
位域的引用很简单,如:
k1.a=1;
//置k1的b0位为1
k1.b=7;
//将k1的b3-5位置111
通过位域定义位
变量
,是实现单
个位
位操作的重要途径和方法,采用位域定义位变量,产生的
代码
紧凑、高效。这种位域应用于
单片机
开发比较普遍。
❼ C++问题,急啊。。。分别用结构体和位域两种方法存储学生身高,体重和成绩等信息,并以总和为依据进行排序
1. 结构体里的对字符串的赋值转换出错,能不能再说的明白点具体哪里出错?我测试中貌似没有出错
2.位域结构体,指定了多少位应该不能用cin来读入了(否则容易导致溢出),解决办法是使用中间变量来读入,比如可以如下:
int temp[3];
for(i = 0;i<3;i++)
{
cout<<"请依次输入该学生的身高,体重和成绩:"<<endl;
cin>>temp[0]>>temp[1]>>temp[2];
a[i].height = temp[0];
a[i].weight = temp[1];
a[i].score = temp[2];
}
❽ 求助关于位域存储顺序如题 谢谢了
回复
把a放到最下面就行了,你放到最开始当然是bit0了.我想说的是,不管是大端还是小端,你放到哪儿,他肯定就位于哪儿,不需要用什么条件编译来区别大小端
❾ c语言 结构体位域问题
c存在第三个字节
sizeof结构体,这个要看结构体内变量是如何定义的,结构体存放数据有个对齐原则,找到占用最大字节的变量,然后都向它对齐,比如bool和char类型占用一个字节,short占两个字节,int,float为4个字节,double为八个字节。
定义的顺序不同,sizeof的结果不同。我给你举个例子。
structA{
inta;
charb;
charc;
};
sizeof(A)应该为4+1+1,但是需要对齐,所以这个值就是8
图2
这个是struct B的变量存储
❿ 数据结构 -- 位域
一个字节有8位,在存储时有些数据并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。基于这种考虑, C 语言提供了‘ 位域 ’这个数据结构。
在结构体定义时,我们可以指定某个成员变量所占用的二进制位数(Bit),这就是位域。来看下面的例子:
当限制了成员的位数时,如果给成员赋值超过其位数,则会导致数据溢出。来看下面的例子:
上面定义了结构体变量a,包含一个非位域成员m,以及两个位域成员n、ch。分别进行两次赋值并输出,输出结果如下所示:
第一次赋值的输出结果分析:
第二次赋值的输出结果分析:
位域的储存规则如下:
位域实质上是含有位域成员的结构体,所以除了遵循这个储存规则外,还需要遵循结构体分内存对齐规则,接下来通过如下示例来分析位域的存储逻辑。
示例1:
输出结果分析:
因此,bs总共需要22位内存,即3字节,而根据结构体对齐规则,bs的内存必须为其最大成员类型长度(int)的整数倍,所以最终输出为4字节。
示例2:
输出结果分析:
因此,bs总共需要86位的内存空间,即11字节,而根据结构体对齐规则,bs的内存必须为其最大成员类型长度(int)的整数倍,所以最终输出为12字节。
示例3:
输出结果分析:
因此,bs需要152位的内存,即19字节,经由结构体内存对齐,需要是4字节的倍数,所以最终输出为20字节。
1. 数据结构 -- 结构体Struct
2. 数据结构 -- 共用体Union