我试图理解二进制补码:
二进制补码是否意味着这个数字无效:
1000
二进制补码是否不允许对正数使用最高有效位。IE。可以
1000
曾经代表 2^3 吗?还是代表-0?
我也很困惑为什么你需要在一个补码上加 1。
我试图理解二进制补码:
二进制补码是否意味着这个数字无效:
1000
二进制补码是否不允许对正数使用最高有效位。IE。可以
1000
曾经代表 2^3 吗?还是代表-0?
我也很困惑为什么你需要在一个补码上加 1。
2 的补码主要取决于您如何解释该值,大多数数学* 并不关心您是否将数字视为有符号。如果您使用 4 位,则 1000 是 8 以及 -8。这种“奇怪的对称性”出现在这里,因为将它添加到一个数字与将它与一个数字异或相同(因为只设置了高位,所以没有进位到任何位)。它也来自二进制补码的定义 - 否定将这个数字映射到自身。
通常,任何数字都k
代表一组数字{ a | a = xk mod n }
,其中n
2 是您正在使用的位数的幂。这种可能有点奇怪的效果是使用模运算的直接结果,无论您将数字视为有符号还是无符号,都是如此。有符号和无符号解释之间的唯一区别是您将哪个数字作为此类集合的代表。对于无符号,代表是唯一a
介于 0 和 之间的代表n
。对于带符号的数字,代表是唯一a
介于-(n/2)
和之间的数字(n/2)-1
。
至于为什么要加一个,否定的目的就是要找一个x'
这样的x' + x = 0
。如果您仅对其中的位进行补充x
但未添加一位,x' + x
则在任何位置都不会进位,而只是求和为“全1”。“全一”加 1 为零,因此加一修正x'
,使总和变为零。或者(好吧,这并不是真正的替代方案),您可以采取~(x - 1)
,它给出的结果与~x + 1
.
*符号会影响除法、右移和乘法的高半部分(很少使用,并且在许多编程语言中无论如何都不可用)的结果。
在二进制补码中,MSB(最高有效位)设置为 1 表示负数。将二进制补码数乘以 -1,您可以执行以下操作:
在数字上加一。 反转第一个之后的所有位。
例如:加一后
的数字10010
你很好得到:10011
反转后你得到:01101
。
这意味着它10010
是负数 13。
加一后的数字1000
是:1001
反转后:0111
。
这意味着它1000
是负 7。
现在,你的最后一个问题:不。如果您使用二进制补码,则不能将 MSB 用于正数。但是,您可以定义您不使用二进制补码并使用更高的正数。
二进制补码基于两个要求:
假设一个四位表示,比如说,我们有
0 + -0 = 0000 + -0000 (base 2) = 0000 => -0000 = 0000
1 + -1 = 0001 + -0001 (base 2) = 0000 => -0001 = 1111 (carry falls off the end)
现在我们有了我们的构建块,一滴归纳将向您展示“翻转位并加 1”算法正是您将正数转换为其二进制补码负表示所需的。
这取决于您使用多少位来表示数字。
最左边(最大)位的值为 -1*(2**N-1) 或在本例中为 -8。(N 是位数。)后续位是它们的正常值。
所以
1000
是 -8
1111
是 -1 0111 是 7。
但是,如果您有 8 位,这些将成为不同的值!0000 1000
是正数 8。只有最左边的位会为答案添加负值。
在任何一种情况下,数字的范围都是从 1000....0
对于具有 N 位的 -2**(N-1)
0111....1 即 2**(N-1) -1。(这只是正常的基数 2,因为最左边的位是 0。)