Я использовал все виды трюков, чтобы сделать это раньше. Используя союзы, длинные смены и т. Д.
В настоящее время я просто использую memcopy. Это может звучать неэффективно, но в прошлый раз, когда я проверял, компилятор оптимизировал код довольно приятно:
int32_t higher32 (unsigned long long arg)
{
unsigned char * data = (unsigned char *) arg;
int32_t result;
memcpy (&result, data+4, sizeof (int32_t));
return result;
}
int32_t lower32 (unsigned long long arg)
{
unsigned char * data = (unsigned char *) arg;
int32_t result;
memcpy (&result, data+0, sizeof (int32_t));
return result;
}