uint32_t有28位而不是32位

时间:2015-12-03 00:22:59

标签: c gdb uint

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

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
$1 = 0xfeffff2
(gdb) p/x thi
$2 = 0xff00000
(gdb) p/x t2lo
$3 = 0xfffffff2

正如您在此处所见,thi有28位而不是32位,并且添加结果完全错误。谁能告诉我这里发生了什么?

PS:我有一个很大的代码,我不能把我的整个源代码放在这里让你们重现这种情况。此外,这种情况仅发生在某些输入中,并且大部分时间我的代码工作正常。如果您之前遇到类似的事情,我只想和你们联系。 任何帮助将不胜感激。

2 个答案:

答案 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/x0xff00000相同。

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