It might be advantageous to use unsigned integers with explicit sizes in this case:
#include <stdio.h>
#include <inttypes.h>
int main(void) {
uint32_t leastSignificantWord = 0;
uint32_t mostSignificantWord = 1;
uint64_t i = (uint64_t) mostSignificantWord << 32 | leastSignificantWord;
printf("%" PRIu64 "\n", i);
return 0;
}
Output
4294967296
Break down of (uint64_t) mostSignificantWord << 32 | leastSignificantWord
-
(typename)
does typecasting in C. It changes value data type totypename
.(uint64_t) 0x00000001 -> 0x0000000000000001
-
<<
does left shift. In C left shift on unsigned integers performs logical shift.0x0000000000000001 << 32 -> 0x0000000100000000
-
|
does ‘bitwise or’ (logical OR on bits of the operands).0b0101 | 0b1001 -> 0b1101