摘要:什么是位段语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为位段。例如果将位段的类型换为无符号的输出结果为我们接下来再用输出试一下输出结果
C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为位段。利用位段能够用较少的位数存储数据。
struct S { char a:3; char b:4; char c:5; char d:4;};struct S s = {0};s.a = 10; s.b = 12; s.c = 3; s.d = 4;
2、位段占的二进制位数不能超过该基本类型所能表示的最大位数,即位段不能跨字节存储,比如在char是占1个字节,那么最多只能是8位;
这里将_d设为9编译器直接报错
3、在位段中不给其起名字,无法访问该位段,但是计算大小是仍占空间。
struct A { char _a : 2; char _b : 5; char _c : 8; char : 8;}s;int main(){ printf("%d", sizeof(struct A)); return 0;}
输出结果为:
4、不可对位段进行取地址操作
struct A { char _a : 2; char _b : 5; char _c : 8; char : 8;}s;int main(){ printf("%d/n", sizeof(struct A)); char *p = &(s._a);这里对位段中的元素取地址操作 system("pause"); return 0;}
编译时直接报错:
5、如果位段中存储的数据大于位段自身大小就会发生截断问题(在vs2013中测试的结果),在输出时会将截断之后的最高位当作符号位。例:
struct A { char a : 2; char b : 5; char c : 8; char d: 8;}s;int main(){ s.a = 7;//111 s.b = 51;//1 10011 //printf("%d/n", sizeof(struct A)); printf("%d/n", s.a); printf("%d/n",s.b); return 0;}
如果将位段的类型换为无符号的
struct A { unsigned char a : 2; unsigned char b : 5; char c : 8; char d: 8;}s;int main(){ s.a = 7;//111 s.b = 51;//1 10011 //printf("%d/n", sizeof(struct A)); printf("%d/n", s.a); printf("%d/n",s.b); return 0;}
输出结果为:
我们接下来再用u%输出试一下:
struct A { char a : 2; char b : 5; char c :8 ; char : 8;}s;int main(){ s.a = 7;//111 s.b = 51;//1 10011 //printf("%d/n", sizeof(struct A)); printf("a:%u/n", s.a); printf("b:%u/n",s.b); system("pause"); return 0;}
输出结果:
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/123951.html
摘要:结构体类型的特殊声明在初阶结构体中,我们已经将了结构体类型是如何进行声明的,那么在这里,我们将讲一些特殊的结构体声明不完全的声明。所以我们应该这样写通过指针来找到下一个同类型结构体的写法,我们就称之为结构体的自引用。 ...
摘要:解决方案三结构体变量的定义和初始化有了结构体类型,那要怎么样来定义结构体变量和初始化变量呢例声明类型的同时定义变量定义结构体变量初始化定义变量的同时赋初值。 结构体 目录 一、结构体类型的声明 结构的声明 特殊的声明 二、结构的自引用 结构体正确的自引用方式 三、结构体变量的定义和初始化 四...
摘要:如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍。 user_defined_d...
阅读 643·2021-11-22 15:32
阅读 2727·2021-11-19 09:40
阅读 2322·2021-11-17 09:33
阅读 1280·2021-11-15 11:36
阅读 1877·2021-10-11 10:59
阅读 1487·2019-08-29 16:41
阅读 1791·2019-08-29 13:45
阅读 2162·2019-08-26 13:36