2015-12-03 210 views
-1

我遇到了一个令人困惑的情况。我有这个简单的加法我的代码里面:uint32_t有28位而不是32位

temp = thi + t2lo; 

我已经定义thit2lo在我的代码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:我有一个大的代码,我不能把我的整个源代码放在这里为你们重现这种情况。此外,这种情况只发生在某些输入和大部分时间我的代码工作正确。我只是想和你们核对一下,如果你之前遇到过这样的事情。 任何帮助将不胜感激。

+0

不要把_all_你的代码放在这里,只是写一个小例子来说明问题。如果你不能,如果问题在你删除剩下的代码时就消失了,那么这可能是由于其他代码中的某些内容引起的,我们很难猜测它是什么。 –

+1

拥有28bit:调试器可能只是省略前导零。 – MikeCAT

+0

当我用十进制打印10时,它仅以“10”出现。哦,不,这意味着'int's只能容纳99个数字! – immibis

回答

4

temp = (uint64_t)thi + t2lo;

没有铸造(或东西等效)添加将在图32B来执行,然后将结果推广到64B。实际上你看到的是0xff00000 + 0xfffffff2 = 0x10FEFFFF2,其中32b算术等于0xFEFFFF2。

+0

我使用了演员,但没有奏效。结果仍然不正确 – A23149577

+0

@Ajeneral:极不可能......编辑您的问题并将实际代码作为可编译单元发布。 – chqrlie

+0

@AJeneral我不认为'p/x'是uint64_t的正确输出格式,但我现在没有gdb方便验证。 – dxiv

相关问题