Объединить два 32-битных числа, чтобы получить 64-битный результат - PullRequest
2 голосов
/ 20 мая 2011

Мне нужно объединить два шестнадцатеричных числа по 32 бита каждое, чтобы получить конечный результат в 64 бита. Я попробовал следующий код, но не получил хороший результат:

unsigned long a,b;
unsigned long long c;
c = (unsigned long long) (a << 32 | b);

Кто-нибудь может мне помочь, пожалуйста? Спасибо.

Ответы [ 5 ]

11 голосов
/ 20 мая 2011

Используйте правильные типы фиксированного размера и будьте осторожны с продвижением типов и приоритетом операторов, например

#include <stdint.h>

uint32_t a, b;
uint64_t c;

c = ((uint64_t)a << 32) | b;
3 голосов
/ 20 мая 2011

Вам нужно привести a к long long, прежде чем сдвинуть его:

unsigned long long c = ((unsigned long long)a << 32 | b);
1 голос
/ 20 мая 2011

Самая короткая форма:

c = a+0ULL<<32|b
0 голосов
/ 20 мая 2011

Я полагаю, что это поможет:

typedef unsigned long U64 ; // your unsigned 64-bit int typedef here
typedef unsigned int  U32 ; // your unsigned 32-bit int typedef here

U64 join( U32 a , U32 b )
{
   U64 result = ((U64)a) << 32
              | ((U64)b)
              ;
   return result ;
}

Я оставлю вас, чтобы угадать соответствующие typedef для U64 и U32.

0 голосов
/ 20 мая 2011

Третья строка должна быть изменена на

((unsigned long long)a) << 32 | ((unsigned long long) b)

Что делает ваш текущий код, берет 32-битную переменную a и сдвигает ее на 32 бита влево (делая ее значение 0,так как нижние 32 бита все пустые), то с помощью 32-битной переменной b.

измененная версия выполняет регистрацию 32-битной переменной a до 64 бит, сдвиньте его на 32 бита влево, приведите 32-битную переменную b к 64-битам, а затем или две 64-битные переменные вместе.Результат, естественно, 64 бит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...