打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
2字节取值范围

到目前为止,我们学习的C语言程序,都是以字节为单位,譬如64位操作系统下,int类型一般为4字节,long类型一般为8字节。

这样的程序编写久了,我们都好像把字节当成计算机的原子单位了。

其实呢,一个字节包含8个比特位,我们是可以把一个字节掰成几部分,每个部分使用一个或几个比特的。

1、C语言中的字节拆分使用,是通过struct来定义的,struct中以比特位为单位定义的成员,我们称为位域。

看下面的例子:

#include #pragma pack(1)struct TSingleBits{ unsigned m_uiGrade:3; unsigned m_uiAge:5;};int main(){ struct TSingleBits singleBits; singleBits.m_uiGrade = 4; singleBits.m_uiAge = 10; printf('size of singleBits is : %lu', sizeof(singleBits)); printf('grade: %u', singleBits.m_uiGrade); printf('age: %u', singleBits.m_uiAge); return 0;}

解释一下,程序中使用了# pragma pack(1)编译选项,用于告诉编译器,这个程序使用的内存,逐个字节进行对齐。

程序的运行结果:

size of singleBits is : 1grade: 4age: 10

解释一下:

1、singleBits变量只占用1字节;

2、它的这1字节,又分成了两个部分m_uiGrade和m_uiAge;

3、m_uiGrade占用3比特;

4、m_uiAge占用5比特。

5、m_uiGrade和m_uiAge都是无符号类型的数据。

上面的例子,位域为无符号型。

2、其实位域也可以为有符号的类型

我们把上面的例子修改一下:

#include #pragma pack(1)struct TSingleBits{ signed m_iGrade:3; signed m_iAge:5;};int main(){ struct TSingleBits singleBits; singleBits.m_iGrade = 3; singleBits.m_iAge = 10; printf('size of singleBits is : %lu', sizeof(singleBits)); printf('grade: %d', singleBits.m_iGrade); printf('age: %d', singleBits.m_iAge); return 0;}

程序的运行结果为:

size of singleBits is : 1grade: 3age: 10

3、下面是一个最极端的例子,signed类型的位域,并且只分配一个比特:

代码如下:

#include #pragma pack(1)struct TSingleBits{ signed m_iGrade:1; signed m_iAge:5;};int main(){ struct TSingleBits singleBits; singleBits.m_iGrade = 1; singleBits.m_iAge = 10; printf('size of singleBits is : %lu', sizeof(singleBits)); printf('grade: %d', singleBits.m_iGrade); printf('age: %d', singleBits.m_iAge); return 0;}

程序编译后运行的结果是:

size of singleBits is : 1grade: -1age: 10

这里有一个比较奇怪的事情,我们明明给m_iGrade赋值为1,为什么结果为-1呢?

答案是,m_iGrade的取值范围为 -1~0,赋值为1越界了!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
字节序(byte order)和位序(bit order)
史上最高效编程学习方法,十分钟学会使用C语言函数
经典程序100例(71-80)
循环链表实现约瑟夫环问题
gethostbyname 函数应用实例
C语言结构体的“继承”
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服