uint32_t 有 28 位而不是 32 位

uint32_t has 28 bits instead of 32 bits

我遇到了一个令人困惑的情况。我的代码中有这个简单的添加:

temp = thi + t2lo;

我在代码中将 thit2lo 定义为 uint32_t,将 temp 定义为 uint64_t:

uint32_t thi, tlo, t2hi, t2lo;
uint64_t temp = 0;

我的代码不能正常工作,所以我使用 gdb 找出问题所在。当我尝试在 gdb 中打印变量时,我得到:

(gdb) p/x temp
 = 0xfeffff2
(gdb) p/x thi
 = 0xff00000
(gdb) p/x t2lo
 = 0xfffffff2

这里可以看到,thi是28位而不是32位,加法结果是完全错误的。谁能告诉我这是怎么回事?

PS:我的代码量很大,我不能把我的全部源代码放在这里让你们重现这种情况。此外,这种情况只发生在某些输入上,而且大多数时候我的代码工作正常。我只是想问问你们以前是否遇到过这样的事情。 任何帮助将不胜感激。

temp = (uint64_t)thi + t2lo;

如果没有转换(或类似的东西),加法将在 32b 中执行,然后结果扩展到 64b。这实际上是你看到的 0xff00000 + 0xfffffff2 = 0x10FEFFFF2 在 32b 算术中等于 0xFEFFFF2.

uint32_t的大小是32位,不是28位。

这里发生的是最重要的 4 位是 0,gdb 不打印前导零 p/x

0xff00000 等同于 0x0ff00000.

使用p/z thi在显示时包含前导零。看看这里: https://sourceware.org/gdb/onlinedocs/gdb/Output-Formats.html