Здравствуйте , помогите упаковать два числа два инта (int16_t ) в один лонг и разпаковать обратно , оба числа могут быть отрицательными .
Для начала сформулируйте тестовый пример, на чем испытывать код : вход - выход.
Если Вам нужно то, о чем я подумал, а не всякие извращения, то проще всего использовать объединения (union).
Но лучше все-таки подробнее опишите что вы хотите получить, а то не уверен что правильно угадал.
имеем
int a=10;
int b=-5;
int32_t f;
требуется некий алгоритм сохранения а и b в f и извлечения обратно . Пробовал сдвиг , не работает корректно с отрицательными числами .
Нужно это всё чтоб хранить данные 16 бит в массиве 32 бита , памяти свободной мало , на массиве висит DMA (речь про stm32 и FFT) соответственно трогать его нет смысла .
Возможно есть более простой вариант "виртуального массива " когда числа int16_t по факту складываем в массив int32_t (по 2 штуки вместе ) и также оттуда вытягиваем
Ну что-то типа этого:
typedef union {
struct {
uint16_t low;
uint16_t high;
};
uint32_t value;
} Mytype;
...
Mytype myvar;
...
myvar.low=10;
myvar.high=-5;
int32_t f=myvar.value;
...
По сути у нас переменная myvar, которая занимает 4 байта, и обращаться к ней можем как целиком к int32_t (myvar.value), так и отдельно к старшему и младшему словам myvar.low и myvar.high
понял , спасибо , попробую
А в чем проблема? Не надо ничего упаковывать и не нужно никакого “алгоритма”. Честно говоря, это настолько просто, что я не понимаю, о чем вы спрашиваете.
Что массив int16_t, что массив int32_t - это всего лишь сплошная последовательность байтов. И Вы, как автор кода - свободно можете назначить эти байты или массивом интов, или массивом лонгов…
В одном своем проекте (на СТМ32) я заполняю массив как байты, а потом отправляю через DMA парами байт как uint16. При этом ничего не “упаковываю”, а просто беру адрес байт-массива и подсовываю его DMA, говоря, что это массив UINT16
Это две совершенно разные задачи, при том вторая решается намного проще, чем первая.
Вам нужно просто два указателя: на int16_t и на int32_t, указывающие на одну и ту же область памяти. Все!
Элегантно!
Юнион вам помосчь
Мисрастов на Вас нет
Спасибо всем , получилось создать массив int ов и скормить указатель на него в DMA к счастью запись по факту в память без проверок .
Какие проверки? Похоже вы не поняли, как это работает. ДМА пофик, что передавать