连接两个32位数字以获得64位结果

时间:2011-05-19 20:35:14

标签: c

我需要连接每个32位的两个十六进制数,以获得64位的最终结果。 我尝试了以下代码但没有得到好结果:

unsigned long a,b;
unsigned long long c;
c = (unsigned long long) (a << 32 | b);
是的,有人可以帮帮我吗? 感谢。

5 个答案:

答案 0 :(得分:11)

使用适当的固定大小类型,并注意类型提升和运算符优先级,例如

#include <stdint.h>

uint32_t a, b;
uint64_t c;

c = ((uint64_t)a << 32) | b;

答案 1 :(得分:3)

在转移之前,您需要将a投射到long long

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

答案 2 :(得分:1)

最短的形式是:

c = a+0ULL<<32|b

答案 3 :(得分:0)

第三行应更改为

((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位。

答案 4 :(得分:-1)

我想这可以解决问题:

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 ;
}

我将留给你为U64和U32分配适当的typedef。