uint32_t有28位而不是32位
问题描述:
我遇到了一个令人困惑的情况。我有这个简单的加法我的代码里面:uint32_t有28位而不是32位
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:我有一个大的代码,我不能把我的整个源代码放在这里为你们重现这种情况。此外,这种情况只发生在某些输入和大部分时间我的代码工作正确。我只是想和你们核对一下,如果你之前遇到过这样的事情。 任何帮助将不胜感激。
答
的uint32_t
大小是 32位,而不是28
这里发生的是,最显著4位为0,并且前导零不受GDB与p/x
打印。
0xff00000
与0x0ff00000
相同。使用p/z thi
在显示时包含前导零。看看这里: https://sourceware.org/gdb/onlinedocs/gdb/Output-Formats.html
+0
你说得对。但不正确的结果呢? – A23149577
不要把_all_你的代码放在这里,只是写一个小例子来说明问题。如果你不能,如果问题在你删除剩下的代码时就消失了,那么这可能是由于其他代码中的某些内容引起的,我们很难猜测它是什么。 –
拥有28bit:调试器可能只是省略前导零。 – MikeCAT
当我用十进制打印10时,它仅以“10”出现。哦,不,这意味着'int's只能容纳99个数字! – immibis