Я не знаю, лучше ли это, чем решения union или memcpy, но мне пришлось распаковать / упаковать целые числа со знаком 64-бит и не хотел ничего маскировать или сдвигать, поэтому в конечном итоге просто обрабатывает 64-битное значение как два 32-битных значения и присваивает их напрямую следующим образом:
#include <stdio.h>
#include <stdint.h>
void repack(int64_t in)
{
int32_t a, b;
printf("input: %016llx\n", (long long int) in);
a = ((int32_t *) &in)[0];
b = ((int32_t *) &in)[1];
printf("unpacked: %08x %08x\n", b, a);
((int32_t *) &in)[0] = a;
((int32_t *) &in)[1] = b;
printf("repacked: %016llx\n\n", (long long int) in);
}