我有一个计数寄存器,它由两个32位无符号整数组成,一个用于值的高32位(最高有效字),另一个用于值的低32位(最低有效字)。
在C语言中,将这两个32位无符号整数组合起来,然后显示为一个大数的最佳方法是什么?
具体而言:
leastSignificantWord = 4294967295; //2^32-1
printf("Counter: %u%u", mostSignificantWord,leastSignificantWord);
这会打印得很好。
当数字增加到4294967296时,我有了它,所以leastSignificantWord擦除到0,mostSignificantWord(最初为0)现在为1。整个计数器现在应该为4294967296,但现在它只为10,因为我只是将mostSignificantWord中的1和leastSignificantWord中的0连接起来。
我应该如何让它显示4294967296而不是10?
8条答案
按热度按时间idfiyjo81#
在这种情况下,使用具有 explicit 大小的 unsigned 整数可能比较有利:
输出
4294967296
分解
(uint64_t) mostSignificantWord << 32 | leastSignificantWord
(typename)
在C中执行typecasting。它将值数据类型更改为typename
。(uint64_t)0x 00000001-〉0x 0000000000000000001的数据类型和数据类型
<<
执行左移。在C中,对无符号整数执行左移执行logical shift。0x 00000000000001〈〈32 -〉0x 0000000001000000000的最大值,则为零。
|
执行“按位或”(对操作数的位执行逻辑或)。0 b 0101中的值|0 b1001-〉0 b1101之间的关系
mf98qq942#
wqlqzqxt3#
我看法:
另一种方法:
这两个版本都可以工作,并且它们将具有类似的性能(编译器将优化memcpy)。
第二个版本不适用于big-endian目标,但它消除了猜测常数32应该是32还是32 ull的工作。当我看到常数大于31时,我从来不确定。
eiee3dmh4#
还有另一种使用数组和指针的方法:
这段代码对我来说更容易理解和阅读。你只是在内存中创建了一个连续的空间,然后这个内存空间被读取为一个
64-bit unsigned int
值,反之亦然。没有任何操作只涉及内存被读取为不同的类型。编辑
忘了提一下,如果你已经从某个地方读取了
64-bit array
,那么你可以很容易地将所有内容读为32-bit array
对,这是很棒的:输出量:
使用联合结构
使用https://stackoverflow.com/a/2810339/2548351中的结构联合更好、更易读:
wdebmtf25#
我经常以十六进制打印,而不是尝试打印十进制。
所以......
或者,根据体系结构、平台和编译器的不同,有时您可以使用类似于...
或
但是,这种替代方法非常依赖于计算机(字节序,以及64位与32位,...),通常不建议使用。
希望这对你有帮助。
xqnpmsa86#
当upper32和lower32都为负数时,此代码有效:
0aydgbwb7#
您可以通过将32位值写入内存中的正确位置来完成此操作:
但是,这取决于计算机,例如,它在big-endian处理器上无法正常工作。
jgovgodb8#
在游戏后期,但我需要这样一个东西类似于表示一个64位整数的数字base 10字符串在一个32位嵌入式env。
因此,受Link的启发,我编写了这段代码,它可以完成问题中提出的任务,但不限于base 10:可以转换成2 - 10的任何一个碱基,并且可以容易地扩展到N碱基。
如果您要求
您缓冲区将包含4294967296