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

来源:互联网 发布:电工和电气工程师 知乎 编辑:程序博客网 时间:2024/06/05 15:34
#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 : 0x401 : 0x02 : 0x03 : 0x04 : 0x25 : 0x36 : 0x47 : 0x58 : 0x09 : 0x010 : 0x011 : 0x01



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



0 0
原创粉丝点击