资讯专栏INFORMATION COLUMN

C语言-位段

alexnevsky / 2726人阅读

摘要:什么是位段语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为位段。例如果将位段的类型换为无符号的输出结果为我们接下来再用输出试一下输出结果

1、什么是位段

C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为位段。利用位段能够用较少的位数存储数据。

2、位段在使用中需要注意的一些点:

1、位段的内存分配2)位段占的二进制位数不能超过该基本类型所能表示的最大位数,即位段不能跨字节存储,比如在VC中int是占4个字节,那么最多只能是32位;
1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型。
2. 位段的空间上是按照需要以 4 个字节( int )或者 1 个字节( char )的方式来开辟的。
3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
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

相关文章

  • C语言中还有这些类型,别再说你不知道了!手把手带你解锁C语言中的自定义类型,让你写你所想。

    摘要:结构体类型的特殊声明在初阶结构体中,我们已经将了结构体类型是如何进行声明的,那么在这里,我们将讲一些特殊的结构体声明不完全的声明。所以我们应该这样写通过指针来找到下一个同类型结构体的写法,我们就称之为结构体的自引用。 ...

    hizengzeng 评论0 收藏0
  • C语言进阶】自定义类型(1)结构体

    摘要:解决方案三结构体变量的定义和初始化有了结构体类型,那要怎么样来定义结构体变量和初始化变量呢例声明类型的同时定义变量定义结构体变量初始化定义变量的同时赋初值。 结构体 目录 一、结构体类型的声明 结构的声明 特殊的声明 二、结构的自引用 结构体正确的自引用方式 三、结构体变量的定义和初始化 四...

    lanffy 评论0 收藏0
  • 2021-09-05_user_defined_data_types(自定义数据类型)

    摘要:如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍。 user_defined_d...

    liaosilzu2007 评论0 收藏0

发表评论

0条评论

alexnevsky

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<