`

C位域的小知识点

阅读更多
还是在笔试时候接触的题目,弄明白这个问题还是花费了不少的时间的。

首先说的是位域的基本概念,发飞了这么多的时间,就是败在了这儿~
位域的使用是为了节省存储空间,用来声明使用特定数目的位。位域标识符后面冒号所跟的数字即为要使用的位数。而不是将整个存储单元按比例划分,一开始臆测为按比例划分了。

看一下题目

typedef struct  AA
{
        int b1:5;
        int b2:2;
}AA;
void main()
{
        AA aa;
        char cc[100];
        strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");
        memcpy(&aa,cc,sizeof(AA));
        cout << aa.b1 <<endl;
        cout << aa.b2 <<endl;
}

经过内存拷贝函数后,aa的存储单元存储的是字符串"0123”,具体的信息为该字符串的ASCII码30 31 32 33,显然b1占用的是30的最低5位,b2占用的是接下来的2位。
30的存储二进制信息为0011 0000.
最低5位1 0000,扩展为32位int,并据补码求得原码即为-16
接下来2为01 ,扩展后可的其原码为1.

故最后输出的的
-16
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics