У меня есть переменная с двумя значениями int16:
int32_t value = 0x1234ABCD; // a=0x00001234, b=0xFFFFABCD
Наивное решение - сделать маску:
int32_t a = (value & 0xFFFF0000) >> 16;
int32_t b = (value & 0x0000FFFF);
Но с этим у меня нет никакого расширения знака, и b становится 0x0000ABCD
вместо 0xFFFFABCD
.
Следующей моей попыткой было использовать промежуточную структуру.
struct dual_int16 {
long hi:16;
long lo:16;
}
int32_t a = (struct dual_int16)value).lo;
int32_t a = (struct dual_int16)value).hi;
К сожалению, мой компилятор не позволяет мне делать это: «struct dual_int16 не разрешена» или «тип приведения должен быть арифметическим или указателем».
Есть ли правильный способ извлечь мой 2x int16 с расширением знака в C99?
ИЗМЕНИТЬ
Потому что я использую конкретный компилятор (ADSP-21xxx). У меня нет всех стандартных типов, определенных в stdint.h
, таких как int16_t
. Мой компилятор не распознает int8_t
и int16_t
.
Арка имеет гибридный 32-48битный двойной ALU с прямым порядком байтов.
v1
иv2
в обратном порядке. не обязательно быть более подверженным ошибкам, чем ручной сдвиг, поскольку они фактически одинаковы. 10.12.2014union
- это обычный прием в C, широко используемый в низкоуровневом программировании. 10.12.2014union
для представления выбора. это что-то вродеstruct { enum myenum choice; union { /* some structs */ } value; }
. но в моем случае это должно работать именно так. нет необходимости нацеливаться на конкретную арку, если вы декомпозируете поток в TCP / IP, вы также будете счастливы использоватьunion
. 10.12.2014