经典面试题 之 大小端 & 内存对齐补齐

#include<stdio.h>
	struct S
	{
		union
		{
			struct 
			{
				char a;
				int  b;
			}x;
			char c[10];
		};
	};


int main()
{
	struct S s;
	memset(&s, 0, sizeof(s));
	s.x.a 	= 64;
	s.x.b   = (5<<24) | (4<<16) | (3<<8) | (2);
	int i =0;
	for(i=0; i<sizeof(s); i++)
	{
		printf("%d : 0x%X\n", i, *((char*)(&s) + i));
	}
	printf("%d\n", strlen(s.c));
	
}


考察的技术点 以x86小端模式进行研究
1、内存的对齐补齐,

struct 
{
char a;
int  b;
}x;  内存对齐大小为8个字节

union
{
struct 
{
char a;
int  b;
}x;
char c[10];
}; 8个字节x, char占10个字节又按4个字节对齐, 则为12, 若将int改为long or double or longlong则按8字节对齐结果为16 

2、大端、小端模式
这边以小端
s.x.a = 64;    取值为0x40 由于四个字节补齐 -》 0x00000040
 s.x.b   = (5<<24) | (4<<16) | (3<<8) | (2);   取值为0x05040302

假设内存 存储方式  按照小端的存放 高的内存数据放在低的内存地址上
0x4000  0x4001   0x4002   0x4003 
0x40    0x00      0x00     0x00

0x4004  0x4005   0x4006   0x4007 
0x02    0x03      0x04     0x05
 
0x4008  0x4009   0x4010   0x4011
0x00    0x00      0x00     0x00

3、strlen, sizeof
strlen 遇到\0 结束, 那么遇到00 也结束 。
sizeof 实际内存大小。


4、%X 十六进制输出

最终小端的答案:

0 : 0x40
1 : 0x0
2 : 0x0
3 : 0x0
4 : 0x2
5 : 0x3
6 : 0x4
7 : 0x5
8 : 0x0
9 : 0x0
10 : 0x0
11 : 0x0
1



#include<stdio.h>
int main()
{

    short int x;

    char x0,x1;

    x=0x1122;
    x0=((char *)&x)[0];  //低地址单元

    x1=((char *)&x)[1];  //高地址单元

    printf("x0=0x%x,x1=0x%x\r\n",x0,x1);// 若x0=0x11,则是大端; 若x0=0x22,则是小端......

// 网络序默认大端 存储 0x11 22  ==》0x1122
    short int sp = htons(x); // 主机序--》网络序
    printf("sp =%x\r\n", sp); //小端机器: 则结果0x22 11   

    short int dp = ntohs(sp);
    printf("dp =%x\r\n", dp); //小端机器: 则结果0x11 22   


    return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tiny丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值