2015-12-03 208 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

相關問題