大小端对齐

小端对齐与大端对齐

1)小端对齐(Little-endian):将低序字节存储在低位地址(低位编址)
2)大端对齐(Big-endian):将高序字节存储在低位地址(高位编址)

比如一个数据 0x12345678,地址 0x8000 为起始地址,当使用小端对齐时,0x8000 存储数据 0x78,存储低位数据;当使用大端对齐时,0x8000 存储数据 0x12,存储高位数据

判断大小端

  1. 强制转换
BOOL IsBigEndian()    
{    
    int a = 0x1234;    
    char b =  *(char *)&a;  //通过将int强制类型转换成char单字节,通过判断起始存储位置。即等于 取b等于a的低地址部分    
    if( b == 0x12)    
    {    
        return TRUE;    
    }    
    return FALSE;    
}  
  1. 联合体
BOOL IsBigEndian()    
{    
    union NUM    
    {    
        int a;    
        char b;    
    }num;    
    num.a = 0x1234;    
    if( num.b == 0x12 )    
    {    
        return TRUE;    
    }    
    return FALSE;    
}  

内存对齐

内存对齐满足一下三条规则:

  1. 数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储

  2. 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存

  3. 收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍

#pragma pack(1) 告诉编译器,所有的对齐都按照1的整数倍对齐

#pragma pack(push) //保存对齐状态   
#pragma pack(4)//设定为4字节对齐   
struct test   
{   
char m1;   
double m4;   
int m3;   
};   
#pragma pack(pop)//恢复对齐状态   

作者:augustine0654

出处:https://www.cnblogs.com/augustine0654/p/18278931

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   紫曜花  阅读(130)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-07-01 概率密度与概率分布函数
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示