菜单
首页/博客/大小端字节序

大小端字节序

在数据储存中:

STM32 单片机使用小端模式。

三个神秘代码

下面有三段代码,用于拆分 uint16_t 到 uint8_t,为了使用串口发送。

请分析 buf[1] 和 buf[2] 各是多少?

  1. 使用指针

    uint16_t foo = 0x0066CCFF;
    uint8_t buf[8];
    
    uint8_t *p = (uint8_t *)&foo;
    
    buf[1] =  *p;
    buf[2] =  *(p + 1);
    
  2. 使用移位

    uint16_t foo = 0x0066CCFF;
    uint8_t buf[8];
    
    buf[1] = foo >> 8 & 0xFF;
    buf[2] = foo & 0xFF;
    
  3. 使用 union 联合体

    uint16_t foo = 0x0066CCFF;
    uint8_t buf[8];
    
    enum
    {
        float u16;
        uint8_t u8[2];
    } u16_to_u8;
    
    u16_to_u8.u16 = foo;
    
    buf[1] =  u16_to_u8.u8[0];
    buf[2] =  u16_to_u8.u8[1];
    

答案是:只有 2 答案是固定的(buf[1] = 0x0066,buf[2] = 0xCCFF),而 1、3 都不一定。

大端和小端

小端模式的优势

小端模式在处理器中具有以下优势:

常见的大小端模式设备

需要注意的是,虽然 ARM 处理器可以支持大端模式,但 STM32 作为 ARM Cortex-M 系列的实现,默认工作在小端模式,且无法通过软件更改其字节序。