数据的存放顺序和对齐方式

文章通过设计程序探讨了计算机中数据是以大端法还是小端法存储,并展示了如何通过检查内存中数据的低位来判断。此外,还讨论了内存变量,如结构体,是如何按照边界对齐的,解释了为何编译器会自动对齐内存边界,并通过示例说明了对齐的重要性。
摘要由CSDN通过智能技术生成
  • 实验要求

了解数据在机器中的存放方式。

  • 实验结果与分析
    1. 设计一个程序以检查你的机器是大端方式还是小端方式。

Big endian大端和Little endian小端的区别体现在对数据的存储和读取方式,大端方式将数据低位保存在内存的高位,小端模式则将数据高位保存在内存高位。因此只要知道储存数据的内存最低一位(或最高位)中保存的是否数据低位,就能判断是否为小端(或大端)存储。故代码如下,为int型数据赋值,注意要是该数每个byte存储的数据有区别,十六进制下该数每两位应不相同,例如0x0a0b0c0d。然后考虑读取内存中最低一位byte数据,把该数据的存储位置赋给字符指针,使字符指针指向该数存储位置开端即低位。再将该指针对应字符转换为整型数据与原数高位和低位对比即可。

 

图表 1判断大端、小端实现代码

结果如下

 

图表 2输出结果

故我的电脑是大端方式。

    1. 设计一个程序以检查内存变量(如结构或数组)是否按边界对齐。

 

图表 3定义结构体输出占用内存

 

图表 4运行结果

结构体node空间占用如下表(每格表示1byte)

结构体test空间占用如下表(每格表示1byte)

 

故可以得知编译器自动对齐内存边界。

  • 实验小结

 

图表 5结构体定义

      定义如上结构体,下讨论该结构体占用内存为24byte而非20byte。

先假设该结构体占用空间如下表,占用20byte。

 

考虑连续写入(或从内存中读取)两个上述结构体,有

假设第一个结构体中c存储起始位置为a,d的起始存储位置为a+28,无法被8整除,与边界对齐要求矛盾。

上述结构体正确的占用空间为:

 

占用空间为24byte。

 

图表 6验证结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值