#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;
}