我有一个计数寄存器,它是由两个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
0x0000000000000001 << 32 - > 0x0000000100000000
![]()
|确实"按位或"(操作数的逻辑或比特).
0b0101 | 0b1001 - > 0b1101
twk*_*twk 35
long long val = (long long) mostSignificantWord << 32 | leastSignificantWord;
printf( "%lli", val );
Run Code Online (Sandbox Code Playgroud)