-1

困った事態に遭遇しました。コード内に次の簡単な追加があります。

temp = thi + t2lo;

私は自分のコードで and thiast2loを定義しました: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には 32 ビットではなく 28 ビットがあり、加算結果は完全に間違っています。ここで何が起こっているのか誰か教えてもらえますか?

PS:私は大きなコードを持っているので、この状況を再現するためにソース コード全体をここに置くことはできません。また、この状況は特定の入力に対してのみ発生し、ほとんどの場合、コードは正しく機能しています。以前にこのようなことに遭遇したかどうか、皆さんに確認したいだけです。どんな助けでも大歓迎です。

4

2 に答える 2

4

temp = (uint64_t)thi + t2lo;

キャスト (または同等のもの) がなければ、加算は 32b で実行され、結果は 64b に拡張されます。これは、実際には 0xff00000 + 0xfffffff2 = 0x10FEFFFF2 であり、32b 演算では 0xFEFFFF2 に等しくなります。

于 2015-12-03T00:33:19.203 に答える
4

のサイズはuint32_t 28ビットではなく 32 ビットです。

ここで何が起こるかというと、最上位 4 ビットが 0 であり、先頭のゼロが gdb with によって出力されないということp/xです。

0xff00000と同じ0x0ff00000です。

p/z thi表示時に先頭のゼロを含めるために使用します。こちらをご覧ください: https://sourceware.org/gdb/onlinedocs/gdb/Output-Formats.html

于 2015-12-03T00:33:26.397 に答える