【发布时间】:2018-08-17 01:59:17
【问题描述】:
我有一个二进制补码的 18 位整数,我想将其转换为有符号数,以便更好地使用它。在我使用的平台上,整数是 4 个字节(即 32 位)。基于这篇文章:
Convert Raw 14 bit Two's Complement to Signed 16 bit Integer
我尝试了以下方法来转换数字:
using SomeType = uint64_t;
SomeType largeNum = 0x32020e6ed2006400;
int twosCompNum = (largeNum & 0x3FFFF);
int regularNum = (int) ((twosCompNum << 14) / 8192);
我将数字左移 14 位以将符号位作为最高有效位,然后除以 8192(在二进制中,它是 1 后跟 13 个零)以恢复幅度(如上面的帖子中所述)。但是,这似乎对我不起作用。例如,输入 249344 给我 -25600,这从表面上看似乎不正确。我做错了什么?
【问题讨论】:
-
twosCompNum是什么类型? -
twosCompNum 是一个 int,但它是一个 uint64_t 的低 18 位。
-
将这些操作拆分为它们自己的代码行。使用调试器逐步完成。应该很明显发生了什么。
-
您也可以使用按位运算来观察符号位并重建您的数字。
-
249344 对于 18 位 2s 补码整数来说太大了,只能在 -131072 .. 131071 范围内。
标签: c++ twos-complement