Использование объединения для преобразования массива из четырех uint8_t в uint32_t в ANSI C - PullRequest
2 голосов
/ 12 февраля 2020

Я работаю над кодом в XC8 (C компилятор для 8-битных микроконтроллеров Microchip, вероятно, основанный на g cc).

Я использую много байтовый массив -> что угодно и что угодно -> преобразования байтового массива, подобные этому:

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;

Я хочу уменьшить процессор и / или использование памяти.

Предположим:

  • этот код будет использоваться с тем же компилятором
  • Я знаю, что такое endiannes есть и не изменится без моего ведома:)
  • Я знаю, что у разных компиляторов может быть другое поведение в отношении выравнивания (я тестировал Microchip XC8, XC32, некоторые компиляторы STM).

Почему я спрашиваю об этом?

Я хочу убедиться, что нет проблем с массивами, такими как "неопределенное поведение" при приведении byte array к int et c.

1 Ответ

1 голос
/ 12 февраля 2020

союз наказания в порядке 100%. нет никаких проблем (кроме endianes) вообще.

...