开发者

Concatenate two 32bit numbers to get a 64bit result

I need to concatenate two hexadecimal numbers 32 bits each each, to get a final result of 64 bits. I tried the following code but didn't get a good result:

unsigned long a,b;
unsigned long long c;
c开发者_如何学JAVA = (unsigned long long) (a << 32 | b);

Can anybody help me please? Thanks.


Use proper fixed size types and be careful about type promotion and operator precedence, e.g.

#include <stdint.h>

uint32_t a, b;
uint64_t c;

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


You need to cast a to long long before shifting it:

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


Shortest form is:

c = a+0ULL<<32|b


The third line should be changed to

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

What your current code is doing, is taking the 32-bit variable a and shifting it 32 bits to the left (making its value 0, because the bottom 32 bits are all empty), then or-ing it with the 32-bit variable b.

What the changed version does is to case the 32-bit variable a to 64 bits, shift it 32 bits to the left, cast the 32-bit variable b to 64 bits, then or the two 64-bit variables together. The result is naturally 64 bits.


I would imagine that this would do the trick:

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

I'll leave to you to divine the appropriate typedefs for U64 and U32.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜