如何将两个32位整数组合成一个64位整数?

jia*_*ake 22 c printf

我有一个计数寄存器,它是由两个32位无符号整数,一个用于值(最显著字)的高32位,以及其他为值(至少显著字)的低32位.

在C中组合这两个32位无符号整数然后显示为大数的最佳方法是什么?

具体来说:

leastSignificantWord = 4294967295; //2^32-1

printf("Counter: %u%u", mostSignificantWord,leastSignificantWord);
Run Code Online (Sandbox Code Playgroud)

这打印很好.

当数字增加到4294967296时,我有它,所以最少有意思的W擦除为0,而且最重要的是Word(最初为0)现在为1.整个计数器现在应该读取4294967296,但是现在它只读取10,因为我只是连接1个来自最重要的词,0个来自最不重要的词.

我怎么能让它显示4294967296而不是10?

jfs*_*jfs 61

在这种情况下,使用具有显式大小的无符号整数可能是有利的 :

#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;
}
Run Code Online (Sandbox Code Playgroud) 产量

4294967296

分解 (uint64_t) mostSignificantWord << 32 | leastSignificantWord

  • (typename)在C 中进行类型转换.它将值数据类型更改为typename.

    (uint64_t)0x00000001 - > 0x0000000000000001

  • <<左移.在C中,无符号整数的左移执行逻辑移位.

    0x0000000000000001 << 32 - > 0x0000000100000000

左转逻辑

  • |确实"按位或"(操作数的逻辑或比特).

    0b0101 | 0b1001 - > 0b1101

  • 辉煌.有些人不仅知道如何使用具有明确大小的C99类型,而且还了解如何使用相关的`printf`宏.+10,如果可以的话.SO-ers,团结起来!这个答案值得高度评价! (4认同)

twk*_*twk 35

long long val = (long long) mostSignificantWord << 32 | leastSignificantWord;
printf( "%lli", val );
Run Code Online (Sandbox Code Playgroud)

  • 请使用C99类型`uint32_t`和`uint64_t`.这就是他们在那里的原因. (27认同)
  • 如果`mostSignificantWord`是一个32位整数,`<< 32`将无效.它需要首先转换为64位类型.顺便说一句,在g ++中,`long`和`long long`都是8个字节. (3认同)
  • 输入是“无符号”,所以在没有 OP 另有说明的情况下,输出不应该也是吗?`long long` 本身就意味着 `signed long long int`。 (3认同)