使用并集将四个uint8_t的数组转换为ANSI C中的uint32_t

问题描述 投票:1回答:1

我正在XC8(适用于Microchip 8位微控制器的C编译器,可能基于gcc)上编写一些代码。

我正在使用许多字节数组->随便什么->类似于此的字节数组转换:

inline int32_t GetInt32(uint8_t b3, uint8_t b2, uint8_t b1, uint8_t b0)
{
    int32_t b_31_24 = (((int32_t)b3) << 24);
    int32_t b_23_16 = (((int32_t)b2) << 16);
    int32_t b_15_08 = (((int32_t)b1) << 8);
    int32_t b_07_00 = b0;

    return b_31_24 + b_23_16 + b_15_08 + b_07_00;        
}

我可以这样使用工会吗?

typedef union {
    int32_t int32value;
    uint32_t uint32value;
    int16_t[2] int16words;
    uint16_t[2] uint16words;
    int8_t[4] int8bytes;
    uint8_t[4] uint8bytes;
} union32_t;

我想减少CPU和/或内存使用。

让我们假设:

  • 此代码将与同一编译器一起使用
  • 我知道什么是endiannes,并且在我不知道的情况下它不会改变:)
  • 我知道不同的编译器在对齐方面可能有不同的行为(我已经测试了Microchip XC8,XC32和某些STM编译器。

为什么要问这个?

我想确定的是,在将byte array转换为int等时,数组是否存在诸如“未定义的行为”之类的问题,>

我正在XC8(可能是基于gcc的Microchip 8位微控制器的C编译器)上编写某些代码。我正在使用许多字节数组->随便什么->字节数组转换类似于:...

c arrays union c99
1个回答
1
投票

工会修剪是100%的罚款。根本没有问题(字节序除外)。

© www.soinside.com 2019 - 2024. All rights reserved.