我遇到了一个令人困惑的情况。我在代码中添加了这个简单的内容:
temp = thi + t2lo;
我在代码中将thi
和t2lo
定义为uint32_t
,将temp
定义为uint64_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:我有一个很大的代码,我不能把我的整个源代码放在这里让你们重现这种情况。此外,这种情况仅发生在某些输入中,并且大部分时间我的代码工作正常。如果您之前遇到类似的事情,我只想和你们联系。 任何帮助将不胜感激。
答案 0 :(得分:4)
library(magrittr)
dat %$% all(b)
# [1] TRUE
如果没有演员表(或类似的东西),将在32b中执行添加,然后将结果扩展到64b。实际上你看到的是0xff00000 + 0xfffffff2 = 0x10FEFFFF2,它在32b算术中等于0xFEFFFF2。
答案 1 :(得分:4)
temp = (uint64_t)thi + t2lo;
的大小为 32位,而不是28位。
这里发生的是最重要的4位为0,并且gdb不会使用uint32_t
打印前导零。
p/x
与0xff00000
相同。
使用0x0ff00000
在显示时包含前导零。看看这里:
https://sourceware.org/gdb/onlinedocs/gdb/Output-Formats.html