16 位二进制补码

16-bit two's complement number

问题是
以下 16 位数字的补码是多少?

1.0x3f9d

我的回答是:

0011111110011101 in binary because 0x3f9d is a positive number.

不过有人说答案是:

1100000001100011

我很困惑,因为 1100000001100011 是一个负数。哪个是正确答案?

3F9Dh为正数,等于0011 1111 1001 1101二进制。只有当一个数是负数时,才说二进制补码才有意义。

您可能会将(数字的)二进制补码表示与算法 "calculate two's complement of x" 混淆。如果你计算 3F9Dh 的补码,你最终会得到 1100 0000 0110 0011.

在 C 中你可以这样计算

(uint16_t)~0x3F9D + 1

相当于

(uint16_t)-0x3F9D

(假设二进制补码 CPU 而不是一些奇异的废话 CPU)