一道C/C++面试题

tanglei619 2011-11-18 03:15:37
#include <iostream>

using namespace std;

int main()
{
union V {
struct X {
unsigned char s1:2;
unsigned char s2:3;
unsigned char s3:3;
} x;

unsigned char c;
} v;

v.c = 100;

printf("%d\n",v.x.s3);

return 0;
}

结果为3,何解?
...全文
268 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanglei619 2011-11-21
  • 打赏
  • 举报
回复
恩 3Q!~
softwarestudying 2011-11-18
  • 打赏
  • 举报
回复
v是联合体(共用体)变量,共有两个元素x和c,都需要一个字节,它们分配于同一个地址。而x是结构体变量,共有三个元素s1、s2、s3,分别占2位、3位、3位。分配内存时低位在前,最位在后。当有v.c=100(其二进制为01100100)时,各变量的关系及内存存储情况见图所示。
其中x的成员s3为二进制的011,即十进制的3,所以输出结果为3。
Zou_prince 2011-11-18
  • 打赏
  • 举报
回复
struct X {
unsigned char s1:2;
unsigned char s2:3;
unsigned char s3:3;
} x;

加入x的二进制为 XXXXzzzyyyxx
s1占最后2位置:xx;(2)
s2占最后5-2位置:yyy;(3)
s1占最后8-5位置:zzz;(3,如果不够,有多少位算多少位)

c = 100
二进制为:1100100
s3=11; s2=001; s1=00;
s3=3; s2=1; s1=0;

假如
c = 200
二进制为:11001000
s3=110; s2=010; s1=00;
s3=6; s2=2; s1=0;

假如
c = 300
二进制为:100101100
s3=001; s2=011; s1=00;
s3=1; s2=3; s1=0;

现在能理解么

dijisaiyaren 2011-11-18
  • 打赏
  • 举报
回复
struct X {
unsigned char s1:2;
unsigned char s2:3;
unsigned char s3:3;
} x;


本人初学者
有个东西不懂啊,这个结构体里面定义的是些啥东西?
unsigned char s1:2;
luciferisnotsatan 2011-11-18
  • 打赏
  • 举报
回复
位域
大小端

tanglei619 2011-11-18
  • 打赏
  • 举报
回复
谢谢帮助,我在想想哈!~
bdmh 2011-11-18
  • 打赏
  • 举报
回复
x和v公用一块内存,而且要看大小端,一般的如下
100二进制是1100100,那么s3是11,s2是001,s1是00
eyodo8 2011-11-18
  • 打赏
  • 举报
回复
这是位结构,100的二进制为01100100,s3是011,打印出来自然是3

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧