码迷,mamicode.com
首页 > 其他好文 > 详细

结构体里的“位域”(bit-field)结构

时间:2016-08-27 23:22:30      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

  首先看一个题目:

 1 #include <iostream>
 2 using namespace std;
 3 #include <string.h>
 4 typedef struct AA{
 5     int b1:5;//第一个字节的低5位,即b0:b4 
 6     int b2:2;//b5:b2 
 7 }AA;
 8 
 9 int main(int argc, char** argv) {
10     AA aa;
11     char cc[100];
12     strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");
13     memcpy(&aa,&cc,sizeof(AA));
14     cout<<aa.b1<<endl;
15     cout<<aa.b2<<endl;
16     return 0;
17 }

 请问,上述代码的输出结果? 答案是-16,1.

第12行,将字符串“0123456789abcdefghijklmnopqrstuvwxyz”赋给字符数组cc.第13行,将大小为sizeof(AA),也就是4个字节(因为只定义了一个int型)的数据赋给aa指向的内存空间。因为cc的前4个字节数据为“0123”,也就是0x30313233,所以aa指向的内存空间的前4个字节数据即为0x30313233,其中第一个字节的二进制为:00110000.而aa.b1是第一个字节的低5位,即10000(-16),同理aa.b2是01(1)

现将上述代码的第11、12行改为:

int cc=0x30313233;

那么,上述代码的输出结果为?答案是-13,1.(在x86平台下)

这是为什么呢?因为x86是小端存储,在执行第13行拷贝的时候,是先将int cc的低位字节的数据拷贝到aa里,所以aa的前4个字节为:0x33323130,其第一个字节为00110011.

结构体里的“位域”(bit-field)结构

标签:

原文地址:http://www.cnblogs.com/mountainfly/p/5813918.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!