经典面试题 之 大小端 & 内存对齐补齐
来源:互联网 发布:电工和电气工程师 知乎 编辑:程序博客网 时间: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
- 经典面试题 之 大小端 & 内存对齐补齐
- 内存对齐、内存补齐
- 内存对齐与补齐 字节对齐与结构体大小
- 内存-大小端对齐
- 内存对齐(补齐)
- 内存对齐与补齐
- 内存对齐及大小端
- 内存对齐及大小端
- 内存中的对齐与补齐
- 谈谈关于内存对齐与补齐
- 谈谈关于内存对齐与补齐
- 内存的对齐和补齐
- 谈谈关于内存对齐与补齐
- C/C++内存对齐补齐机制
- 谈谈关于内存对齐与补齐
- 谈谈关于内存对齐与补齐
- 谈谈关于内存对齐与补齐
- 谈谈关于内存对齐与补齐
- iOS - UIScrollView控件实现图片缩放功能(还需补充代码)
- python的闭包
- 91. Decode Ways
- Android 连接Mysql进行相关操作——用PHP做中介以及JSON做数据交换
- php常用库函数
- 经典面试题 之 大小端 & 内存对齐补齐
- 【Android应用开发技术:数据存储】章节列表
- 1037. 在霍格沃茨找零钱(20)
- linux下查看CPU信息
- iOS开发调试技巧总结
- 【暑期基础2】S HDU 2044 一只小蜜蜂... (递推)
- 把项目推送到github
- 序号自增
- 常用的富文本标签