uint32_t 有 28 位而不是 32 位
uint32_t has 28 bits instead of 32 bits
我遇到了一个令人困惑的情况。我的代码中有这个简单的添加:
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
= 0xfeffff2
(gdb) p/x thi
= 0xff00000
(gdb) p/x t2lo
= 0xfffffff2
这里可以看到,thi
是28位而不是32位,加法结果是完全错误的。谁能告诉我这是怎么回事?
PS:我的代码量很大,我不能把我的全部源代码放在这里让你们重现这种情况。此外,这种情况只发生在某些输入上,而且大多数时候我的代码工作正常。我只是想问问你们以前是否遇到过这样的事情。
任何帮助将不胜感激。
temp = (uint64_t)thi + t2lo;
如果没有转换(或类似的东西),加法将在 32b 中执行,然后结果扩展到 64b。这实际上是你看到的 0xff00000 + 0xfffffff2 = 0x10FEFFFF2 在 32b 算术中等于 0xFEFFFF2.
uint32_t
的大小是32位,不是28位。
这里发生的是最重要的 4 位是 0,gdb 不打印前导零 p/x
。
0xff00000
等同于 0x0ff00000
.
使用p/z thi
在显示时包含前导零。看看这里:
https://sourceware.org/gdb/onlinedocs/gdb/Output-Formats.html
我遇到了一个令人困惑的情况。我的代码中有这个简单的添加:
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
= 0xfeffff2
(gdb) p/x thi
= 0xff00000
(gdb) p/x t2lo
= 0xfffffff2
这里可以看到,thi
是28位而不是32位,加法结果是完全错误的。谁能告诉我这是怎么回事?
PS:我的代码量很大,我不能把我的全部源代码放在这里让你们重现这种情况。此外,这种情况只发生在某些输入上,而且大多数时候我的代码工作正常。我只是想问问你们以前是否遇到过这样的事情。 任何帮助将不胜感激。
temp = (uint64_t)thi + t2lo;
如果没有转换(或类似的东西),加法将在 32b 中执行,然后结果扩展到 64b。这实际上是你看到的 0xff00000 + 0xfffffff2 = 0x10FEFFFF2 在 32b 算术中等于 0xFEFFFF2.
uint32_t
的大小是32位,不是28位。
这里发生的是最重要的 4 位是 0,gdb 不打印前导零 p/x
。
0xff00000
等同于 0x0ff00000
.
使用p/z thi
在显示时包含前导零。看看这里:
https://sourceware.org/gdb/onlinedocs/gdb/Output-Formats.html