我需要连接每个32位的两个十六进制数,以获得64位的最终结果。 我尝试了以下代码但没有得到好结果:
unsigned long a,b;
unsigned long long c;
c = (unsigned long long) (a << 32 | b);
是的,有人可以帮帮我吗?
感谢。
答案 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。