数据大小端 存储

void Write_EEPROM_u16(uint32_t Address, uint16_t Data)
{
    uint8_t  A, B;
    A = Data & 0xFF;
    B = (Data >> 8) & 0xFF;


    FLASH_Unlock(FLASH_MEMTYPE_DATA);
    //低位在前高位在后,通用小端模式
    FLASH_ProgramByte(Address, B);
    FLASH_ProgramByte(Address + 1, A);


    FLASH_Lock(FLASH_MEMTYPE_DATA);
}


uint16_t Read_EEPROM_u16(uint32_t Address)
{
    uint8_t  A, B;
    uint32_t Data = 0;


    B = FLASH_ReadByte(Address);
    A = FLASH_ReadByte(Address + 1);


    Data = Data + B;
    Data = (Data << 8) + A;
    return(Data);
}


void Write_EEPROM_u32(uint32_t Address, uint32_t Data)
{
    uint8_t  A, B, C, D;
    A = Data & 0xFF;
    B = (Data >> 8) & 0xFF;
    C = (Data >> 16) & 0xFF;
    D = (Data >> 24) & 0xFF;


    FLASH_Unlock(FLASH_MEMTYPE_DATA);
    //低位在前高位在后,通用小端模式
    FLASH_ProgramByte(Address, D);
    FLASH_ProgramByte(Address + 1, C);
    FLASH_ProgramByte(Address + 2, B);
    FLASH_ProgramByte(Address + 3, A);


    FLASH_Lock(FLASH_MEMTYPE_DATA);
}


uint32_t Read_EEPROM_u32(uint32_t Address)
{
    uint8_t  A, B, C, D;
    uint32_t Data = 0;


    D = FLASH_ReadByte(Address);
    C = FLASH_ReadByte(Address + 1);
    B = FLASH_ReadByte(Address + 2);
    A = FLASH_ReadByte(Address + 3);


    Data = Data + D;
    Data = (Data << 8) + C;
    Data = (Data << 8) + B;
    Data = (Data << 8) + A;
    return(Data);
}
### 数据大小端存储 数据大小端存储(Endianness)是指多字节数据在内存中的排列顺序。这一概念对于理解计算机系统中数据存储方式至关重要。 - **大端存储**(Big-endian):最高有效字节(MSB)存储在最低地址上。例如,一个32位整数`0x12345678`在大端模式下会按照`0x12 0x34 0x56 0x78`的顺序存储在内存中。 - **小端存储**(Little-endian):最低有效字节(LSB)存储在最低地址上。同样以`0x12345678`为例,在小端模式下会按照`0x78 0x56 0x34 0x12`的顺序存储[^4]。 大小端存储的概念主要影响到跨平台的数据交换和网络通信。在网络协议中,通常采用大端存储作为标准,以便于不同平台之间的兼容性。 ### 内存对齐机制 内存对齐是计算机系统中的一个重要概念,它指的是数据在内存中的存储位置必须按照一定的规则进行对齐。对齐是为了提高计算机的存取效率,以及兼容不同硬件平台的要求。具体来说,内存对齐通过将数据按照一定的字节边界存储,以提高内存访问效率并确保硬件正常运行。对齐要求通常由数据类型的大小决定,结构体的对齐要求则由最大成员的对齐要求决定。可以通过 `alignas` 和 `alignof` 控制对齐方式,避免因不对齐而带来的性能下降或硬件异常[^2]。 #### 对齐规则 1. **基本数据类型**:每个基本数据类型都有其特定的对齐要求。例如,`int`类型通常需要4字节对齐,`double`类型可能需要8字节对齐。 2. **结构体**:结构体的对齐要求由其内部成员的最大对齐要求决定。这意味着结构体的整体对齐要求不能低于其任何成员的对齐要求。 #### 示例分析 考虑一个简单的结构体: ```c struct Example { char a; int b; short c; }; ``` 在这个例子中,假设`char`占用1字节,`int`占用4字节,`short`占用2字节。根据对齐规则,`a`后面可能会有3字节的填充,以确保`b`的起始地址是4字节对齐的。同样,`b`之后可能有2字节的填充,以确保`c`的起始地址是2字节对齐的。最终,整个结构体的大小可能是12字节(1 + 3 + 4 + 2),其中包含了必要的填充字节[^4]。 ### 总结 - **大小端存储**决定了多字节数据在内存中的排列顺序,这对于跨平台数据交换和网络通信非常重要。 - **内存对齐**提高了内存访问的效率,并且是许多硬件平台的要求。正确理解和应用内存对齐机制可以优化程序性能和可靠性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值