Доступ к нижней половине 64-битного целого - PullRequest
1 голос
/ 18 июля 2010

Как получить доступ к нижней половине 64-битного целого числа, используя C или C ++? Я могу сделать это легко в ассемблере, но я понятия не имею, как это сделать в C / C ++

РЕДАКТИРОВАТЬ: Как насчет доступа к верхней половине?

Ответы [ 2 ]

9 голосов
/ 18 июля 2010
long long BigOne = 0x1234567890ABCDEFLL;
long long LowerHalf = BigOne & 0xFFFFFFFFLL;
long long UpperHalf = (BigOne >> 32) & 0xFFFFFFFFLL;

Извините, если шестнадцатеричные литералы требуют некоторого префикса / суффикса, я не очень знаком с C. Пожалуйста, исправьте ответ, если знаете.

0 голосов
/ 18 июля 2010

Я использовал все виды трюков, чтобы сделать это раньше. Используя союзы, длинные смены и т. Д.

В настоящее время я просто использую 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;
}
...