b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

sizeof计算结构体大小 位段,枚举,联合的讲解

电脑杂谈  发布时间:2018-01-04 14:08:40  来源:网络整理

sizeof联合体_sizeof计算结构体大小_sizeof max

位段:度娘给出的解释是,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。

位段的声明和结构体很相似,但不同的是:

①位段的成员可以是int,unsigned int,signed int或者是char(属于整形家

族)类型

②位段的成员名后边有一个冒号和一个数字,这个数字表示位段所占的二进制位数。

如:

struct A
{
int _a:3;
int _b:4;
int _c:5;
int _d:6;
}a;

那么位段A多大呢?在计算之前,先说下位段怎么存储

简单说就是看变量后面的数字。先看第一个变量类型,开辟对应类型大小的字节,然后数字是多少就占多少bit,剩余bit留给下一个变量用。不够的话再开辟对应类型大小字节数。

细说的话,对于位段结构,编译器会自动进行存储空间的优化,要遵循这些原则原则:

1)如果一个位段存储单元能够存储得下位段结构中的所有成员,那么位段结构中的所有成员只能放在一个位段存储单元中,不能放在两个位段存储单元中;如果一个位段存储单元不能容纳下位段结构中的所有成员,那么从剩余的位段从下一个位段存储单元开始存放。(在VC中位段存储单元的大小是4字节).

2)如果一个位段结构中只有一个占有0位的无名位段,则只占1或0字节的空间(C语言中是占0字节,而C++中占1字节);否则其他任何情况下,一个位段结构所占的空间至少是一个位段存储单元的大小;

再看上面的例子,int类型,开辟四字节大小的空间,对于_a,_b,_c,_d,分别依次按顺序占3,4,5,6bit,最后一共占了18bit,但开辟了4字节,因此用sizeof对该结构体求大小的话是4字节。sizeof计算结构体大小

使用位段需注意以下几点:

1)位段的类型只能是int,unsigned int,signed int三种类型,不能是char型或者浮点型;

2)位段占的二进制位数不能超过该基本类型所能表示的最大位数,比如在VC中int是占4个字节,那么最多只能是32位;

3)无名位段不能被访问,但是会占据空间;

4)不能对位段进行取地址操作;

sizeof max_sizeof计算结构体大小_sizeof联合体

5)若位段占的二进制位数为0,则这个位段必须是无名位段,下一个位段从下一个位段存储单元(这里的位段存储单元经测试在VC环境下是4个字节)开始存放;

6)若位段出现在表达式中,则会自动进行整型升级,自动转换为int型或者unsigned int。

7)对位段赋值时,最好不要超过位段所能表示的最大范围,否则可能会造成意想不到的结果。

8)位段不能出现数组的形式。

二、枚举

就是一一列举出相类似的东西,如星期,班级,商品等。

enum Day // 星期

{Mon,

Tues,

Wed,

Thur,

Fri,

Sat,

Sun

}D1,D2;

enum Class//班级

{

c1,

sizeof max_sizeof计算结构体大小_sizeof联合体

c2,

c3,

}C1,C2;

enum Day, enum Class都是枚举类型,{}中的是枚举常量,不是变量,不能在程序中用赋值语句再对它赋值。枚举常量它们如果没有初始化的话,从第一个默认是0,后面的依次加1。如果初始化了的话,被初始化的枚举常量之前的不变,其他的根据枚举常量的值依次加1。{}后面的D,C类似结构体,是枚举变量。sizeof计算结构体大小

需要注意的是,可以把枚举常量赋给变量,但不能把枚举常量的数值赋给枚举变量。如D1=Mon,D2=Tues;是正确的,而D1=0,D2=1;是错误的。如果非要把数值赋给枚举变量的话需要通过强制类型转换,D1=(enum Day)0;


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-58115-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...