-1

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

temp = thi + t2lo;

我在我的代码中定义了thiand t2loas :uint32_ttempuint64_t

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

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

(gdb) p/x temp
$1 = 0xfeffff2
(gdb) p/x thi
$2 = 0xff00000
(gdb) p/x t2lo
$3 = 0xfffffff2

正如你在这里看到的,thi有 28 位而不是 32 位,加法结果是完全错误的。谁能告诉我这里发生了什么?

PS:我有一个大代码,我不能把我的整个源代码放在这里让你们重现这种情况。此外,这种情况只发生在某些输入上,而且我的代码大部分时间都是正确的。我只是想和你们核实一下,如果你们以前遇到过这样的事情。任何帮助将不胜感激。

4

2 回答 2

4

temp = (uint64_t)thi + t2lo;

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

于 2015-12-03T00:33:19.203 回答
4

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

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

0xff00000是一样的0x0ff00000

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

于 2015-12-03T00:33:26.397 回答