共用体问题,求解

weixin_42534480 2018-06-24 04:45:03
#include <stdio.h>
union pw
{
int i;
char ch[2];
} a;
int main()
{
a.ch[0]=0;
a.ch[1]=1;
printf("%d\n",a.i);
return 0;
}
输出结果为256,能解释一下吗?
...全文
213 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ShanTUT 2018-06-26
  • 打赏
  • 举报
回复
楼主的环境应该是win32了对吧?
这种环境下一个整数是4字节。
你的共用体pw有两个成员,这两个成员长度不等:
int i 是4字节,
char ch[2] 是2字节。
对于不等长的共用体,它的长度是和最长的那个成员相等的。
你给ch[0]赋值0、给ch[1]赋值1。
由于共用体的成员之间是共用一片内存的。
所以i的四个字节分别是:0X00、0X01、0X00、0X00(其中后2个字节你没有初始化,是编译器自动用0帮你初始化的)
但是对于C++来说,它的字节序是小端模式,低字节在前,高字节在后,那么把i的值转换成2进制,并且按照高位在前、地位在后写,就是:
00000000 00000000 00000001 00000000
所以就是256了
自信男孩 2018-06-26
  • 打赏
  • 举报
回复
在小端机器上,高对高,低对低,即高地址对字节,低地址对低字节;
对于int类型的(4字节),由于共用,所以ch[0]对int的低字节,ch[1]对int的高字节(第二个字节)
16进制即0x00000100,对于10进制即255
棉猴 2018-06-26
  • 打赏
  • 举报
回复
程序开始时,a所占的内存空间数据

在执行
	a.ch[0] = 0;
a.ch[1] = 1;

之后,a所占的内存空间数据

正如4楼所说,此时a.i的值是以小端模式保存在内存中,即内存高地址保存的是a.i的高位,内存低地址保存的是a.i的低位。所以
a.i的值应该是0x00000100,即256
赵4老师 2018-06-25
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <stdlib.h>
char buf[17];
union U {
unsigned short int aa;
struct {
unsigned int bb:7;//(bit 0-6)
unsigned int cc:6;//(bit 7-12)
unsigned int dd:3;//(bit 13-15)
};
} u;
void main() {
//bbbbbbbbbbbbbbbb
//iiiiiiiiiiiiiiii
//tttttttttttttttt
//111111
//5432109876543210
//::::::::::::::::
u.aa=0xE07F;//1110000001111111
printf("bb==%d,cc==%d,dd==%d\n",u.bb,u.cc,u.dd);
u.bb=0x41;
u.cc=0x21;//dddccccccbbbbbbb
u.dd=5; //1011000011000001
printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2));
}
//bb==127,cc==0,dd==7
//aa==0xB0C1==1011000011000001(2)

张天星 2018-06-24
  • 打赏
  • 举报
回复
引用 1 楼 qq_17523135 的回复:
a.ch[0]=0;
a.ch[1]=1;
它们的二进制排列就是 0000 0001 0000 0000
前面8位数是ch[1]=1,后面8位是ch[0]=0
int将这16位全部读取出来,就是256 了

张天星 2018-06-24
  • 打赏
  • 举报
回复
a.ch[0]=0;
a.ch[1]=1;
它们的二进制排列就是 0000 0001 0000 0000
前面8位数是ch[1]=1,后面8位是ch[0]=0
int将这16位全部读取出来,就是256 了

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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