В настоящее время я работаю над портом встроенного кода (на Freescale S12), поэтому GNU и я hava проблема с профсоюзами. У меня есть следующий союз
typedef signed short sint16;
typedef signed long sint32;
typedef union
{
sint32 Akku;
sint16 AkkuHigh;
sint16 AkkuLow;
} akku_type;
и я хочу получить доступ к самому большому 2 байту союза. Проблема в том, что оба AkkuHigh и AkkuLow имеют тот же самый стартовый адрес, что и Akku. Это похоже на компилятор. Мои вопросы: есть ли флаг компилятора, который изменяет поведение объединения? Может ли атрибут ((align (2))) помочь мне?
Заранее спасибо
Да, все Akku
, AkkuHigh
, AkkuLow
имеют тот же адрес. Это то, как профсоюзы работают в C. По внешнему виду вы намеревались создать союз с 32-битным членом и членом, который представляет собой структуру из двух 16-разрядных элементов. То, что вы написали, - это не способ его достижения. Попробуйте вместо этого:
typedef union
{
sint32 Akku;
struct s {
sint16 AkkuHigh;
sint16 AkkuLow;
} representation;
} akku_type;
AkkuHigh
будет AkkuHigh
байтом, а AkkuLow
будет AkkuLow
байтом? Не мог ли компилятор решить переключить их?
Правильное определение союза можно найти в этом ответе.
atribute(align(2))
определенно поможет вам, если вы скомпилируете это по 32-битной или 64-битной архитектуре. Кроме того, на 64- sizeof(sint32)
составляет 8
(64 бит).
В зависимости от архитектуры архитектуры вам может потребоваться обмен AkkuHigh
и AkkuLow
.
high
иlow
поля внутренней анонимнойstruct
. Строго говоря, он не переносимый, но должен работать.