关于Union和Struct对齐

关于union,struct,还有机器数赋值,总是感觉自己认识不是特别深刻,这里使用小DEMO程序加以说明,具体的详细细节描述其它地方已经有说明和记录,这里不再说明。

#include <stdio.h>

union myun 
{
struct { int x; int y; int z; }u; 
int k; 
}a; 

int main() 
{ 
	a.u.x =4;
	a.u.y =5; 
	a.u.z =6; 
	a.k = 0; 

	int size = sizeof(a.u);
	printf("size is %d \n",size);
	printf("%d %d %d\n",a.u.x,a.u.y,a.u.z);
	return 0;
}
Output:

size is 12

0  5  6

说明:int 此linux环境下占用4字节,结构体a.u本身已经字节对齐,不需要 padding。union对象内部各成员是共用内存,所以 a.k = 0; 修改了 a.u结构体x区域所指向内存的值。
修改代码:

union myun 
{
struct { int x; char y; int z; }u; 
int k; 
}a; 

int main() 
{ 
	a.u.x =4;
	a.u.y =5; 
	a.u.z =6; 
	a.k = 0; 

	int size = sizeof(a.u);
	printf("size is %d \n",size);
	printf("%d %d %d\n",a.u.x,a.u.y,a.u.z);
	return 0;
}
Output:

size is 12

0  5  6

说明:注意红色部分,思考为什么 size is 12。实际上,y 前面做了 3 byte 的padding。

修改代码:

union myun 
{
struct { char x; char y; int z; }u; 
int k; 
}a; 

int main() 
{ 
	a.u.x =4;
	a.u.y =5; 
	a.u.z =6; 
	a.k = 65535; 

	int size = sizeof(a.u);
	printf("size is %d \n",size);
	printf("%d %d %d\n",a.u.x,a.u.y,a.u.z);
	return 0;
}

Output:

size is 8

-1  -1  6

说明:注意红色部分,思考为什么 size is 8。实际上,x 前面做了 2 byte 的padding。

至于为什么 a.u.x  = -1, a.u.y = -1; 实际上,a.k = 0xffff,从机器码的角度看 a.u.x 和 a.u.y 内存空间上是全 1,然后我们进行补码翻译,翻译成原码,得到其值 -1。这里注意机器表示是用补码表示,最后值的解释如果能够翻译成原码用原码解释,实际上就是机器数(带有符号的真值)。


备注:

具体关于内存对齐,请参阅之前的一篇博文:

http://blog.csdn.net/yj512029078/article/details/22734105

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值