这个问题的开头声明,乍一看,这似乎是SO上其他几个问题的重复,但是这些问题的答案都没有回答我的问题,因此我正在问它。
解释为正整数的二进制整数与解释为十进制的负整数的完全相同的二进制整数之间的关系是什么?让我们以整数 5 为例:
5 是 101
-5 表示11111011
11111011解释为无符号数字时为 251。
问题是,-5 和 251 之间的十进制关系是什么?除了二进制数系统中发生的动作之外,还有直接关系吗?意思是,十进制中是否有一些规则,我们可以直接将任何给定的十进制整数映射到十进制整数,当从正数转换为负数时,相同的二进制整数将是十进制整数,反之亦然?
请注意,-5
实际上并没有以二进制形式11111011
- 这是八位的二进制表示。如果使用不同数量的位,则会得到不同的二进制表示形式。例如,如果您像通常所做的那样使用 16 位,您会得到 1111111111111011
,这是 65531
.
这就是关键。在八位中,我们考虑2^8
哪个是256
。(该插入符号代表幂。然后我们看到-5
由 256 - 5
表示。
所以最终的答案是这样的:对于要用b
二进制位表示的给定正整数n
,则-n
数表示
(2 ^ b) - n
至少,如果b
位数足够大。这清楚吗?可以说的远不止这些,但你最好在一本书或大型网页上阅读更多关于二进制补码符号的信息。
假设我们使用两个补码,我们有一个 n
位的向量:
n = <a(n-1), a(n-2), ..., a(2), a(1), a(0)>
被解释为:
n_signed = -[a(n-1) * 2^(n-1)] + sum(i=0, i=n-2) {a(i) * 2^(i)}
然而,将其视为无符号会导致:
n_unsigned = sum(i=0, i=n-1) {a(i) * 2^(i)}
因此,区别在于:
n_unsigned - n_signed = 2 * [a(n-1) * 2^(n-1)]
希望它有所帮助(并为格式不佳而抱歉)。