2 的按位一元补码运算符 (~) 为 -3。我读到一些二进制表示中的值 2 是 0010 并且按位一元补码运算符将位从 0 更改为 1 的地方,反之亦然。所以~2的值是1101。这意味着-3。但我的困惑是为什么他们将 2 的二进制表示为 0010。根据我的说法,int 是 32 位。那么为什么 2 不能是 000000000000000000000000000000010 而它的一元补码是 11111111111111111111111111111101?我知道错了,但为什么呢?请解释?
问问题
82 次
1 回答
0
您的问题的答案是“选择补码而不是补码,因为有几个方便的特性使算术更容易在数字电路中实现”。
我相信从你问题的措辞来看,一些插图会有所帮助。
要完全理解这一点,您仍然需要阅读二进制补码表示法和算术 - 包括它们的工作原理和历史 - 但我将尝试以类似故事的方式解释这里的基础知识。
假设我们有 4 位来表示有符号整数值。
- 4 位只能表示 16 个不同的值(4 位可以制作 16 个不同的不同“模式”)... 0000, 0001, 0010, 0011, 0100, ... 1111(试试看,更容易看到并以柱状格式开发模式,您将在下面看到我已经完成)
- 确定您希望能够表示的 16 个值
- 可以说 0000 代表零,0001 代表一,以此类推代表正数,但是负数呢?
- 因为零已经“占据了一个位置”,所以我们可以表示 15 个其他整数,因此很明显我们不能表示相同数量的正值和负值。
- 我们做出选择:我们的范围将从 -8 到 +7(我们可能会说 -9 到 +6 或 -7 到 +8 等,但您将在下面看到这个选择的回报)
- 现在哪些位模式应该代表负数?
- 我相信你会同意,如果添加到其加法逆元的每个数字都为零,而我们不需要诉诸 if-negative-then-else(if positive) 逻辑,那将是非常好的。例如,如果 +3 表示为 0011,我们对 1101 进行(二进制)加法,我们得到结果(进位 1)0000。忽略进位,我们得到零。这使得位模式 1101 成为标签“-3”的明显赢家。
- 您可以以相同的方式使用剩余的值,您应该得到以下结果......
-8 1000 -7 1001 -6 1010 -5 1011 -4 1100 -3 1101 -2 1110 -1 1111 0 0000 +1 0001 +2 0010 +3 0011 +4 0100 +5 0101 +6 0110 +7 0111
具有以下美观方便的特点
- “自然计数位模式”。向下看最右边的列,您会看到 0 1 0 1...,然后在下一列中看到 0 0 1 1...,然后是 0 0 0 0 1... 等等,依次完美运行积极的
- 递增“环绕”(0,1,2,...7,-8,-7,-6,...-1,0,1,...等,递减也是如此)
- 加法逆元的二进制加法得到零,没有额外的逻辑来处理符号
- 所有负数的第一位都是 1,零,所有正数都以 0 开头。(第一位称为“符号位”。)
- 加法逆可以通过以下规则/算法获得:“反转所有位,递增,丢弃进位”。魔法!再试3次:
3 : 0011 ~ : 1100 (the NOT operator gives "one's complement") +1: 1101 (the two's complement representation of -3) ~ : 0010 +1: 0011 (back to +3) etc
- 这是二进制补码符号
如果你理解了这个 4 位的故事,你会发现它可以很容易地扩展到适用于 32 位有符号整数。
于 2019-07-31T17:28:13.457 回答