问题是 以下16位数的两个补码是多少?
1.0x3f9d
我的回答是:
0011111110011101二进制,因为0x3f9d是一个正数。
然而,有些人说答案是:
1100000001100011
我很困惑,因为1100000001100011
是一个负数。哪一个是正确答案?
答案 0 :(得分:1)
3F9Dh是正数,等于0011 1111 1001 1101二进制。当一个数字是负数时,说两个补语是有道理的。
你可能会混淆使用算法"计算x"的两个补码这两个词的补码表示(数字)。如果你计算3F9Dh的两个补码,你的确最终会得到1100 0000 0110 0011.
在C中你可以按
进行计算(uint16_t)~0x3F9D + 1
相当于
(uint16_t)-0x3F9D
(假设有两个补充CPU而不是一些奇怪的废话CPU)