从逻辑的角度来说:
签名表示的界限
有 5 位,因此有 32 种不同的组合。这意味着你可以用 5 位组成 32 个不同的数字。对于无符号整数,将 0 到 31(含)的整数存储在 5 位上是有意义的。
然而,这是关于无符号整数。意思是:我们也必须找到一种表示负数的方法。含义:我们必须存储数字的值,还有它的符号(+或-)。使用的表示形式是 2 的补码,并且它是到处都可以学到的表示形式(也许存在其他形式,但我不知道它们)。在此表示中,符号由第一位给出。也就是说,在 2 的补码表示中,正数以 0 开头,负数以 1 开头。
那么问题来了:0是正数还是负数?不可能两者兼而有之,因为这意味着对于给定的数字 a 位,0 可以用两种方式表示(对于 5:00000 和 10000),也就是说,我们失去了再放置一个数字的空间。我不知道他们是怎么决定的,但事实是 0 是一个正数。对于任何位数(有符号或无符号),0 仅用 0 表示。
伟大的。这为我们提供了第一个问题的答案:以 2 的补码表示的十进制数的上限是多少?我们知道第一位是符号,所以我们能表示的所有数字都必须由4位组成。我们可以有 16 个不同的 4 位字符串值,0 就是其中之一,所以上限是 15。
现在,对于负数,这变得很容易。我们已经在 5 位上可以生成 32 个值中填充了 16 个值。还剩 16 个。我们还知道 0 已经被表示了,所以我们不需要包含它。然后我们从 0 之前的数字开始:-1。由于我们有 16 个数字要表示,从 -1 开始,我们可以用 5 位表示的最低有符号整数是 -16。
更一般地,与n
我们可以表示的位2^n
数字。对于有符号整数,一半是正数,一半是负数。也就是说,我们有2^(n-1)
正数和2^(n-1)
负数。我们知道 0 被认为是正数,是我们可以表示的最大有符号整数n
位是2^(n-1) - 1
最低的是-2^(n-1)
2的补码表示
现在我们知道哪些数字可以用 5 位表示,问题是我们如何表示它们。
我们已经看到符号表示在第一位,并且 0 被视为正数。对于正数,它的工作方式与无符号整数相同:00000 是 0,00001 是 1,00010 是 2,等等,直到 01111,即 15。这是我们停止正符号整数的地方,因为我们已经占用了所有我们有 16 个价值观。
对于负符号整数,这是不同的。如果我们保持相同的表示(10001 是 -1,10010 是 -2,...),那么我们最终会得到 11111 为 -15,而 10000 则不被归属。我们可以决定说它是 -16,但每次使用负整数时,我们都必须检查这种特殊情况。另外,这会扰乱所有的二进制运算。我们还可以决定 10000 是 -1、10001 是 -2、10010 是 -3 等等。但这也会弄乱所有的二进制运算。
2 的补码按以下方式工作。假设您有符号整数 10011,您想知道小数是什么。
- 翻转所有位:10011 --> 01100
- 添加 1:01100 --> 01101
- 将其读取为无符号整数:01101 = 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 13。
10011代表-13。这种表示法非常方便,因为它是双向的。如何将 -7 表示为二进制有符号整数?从 7 的二进制表示形式 00111 开始。
- 翻转所有位:00111 --> 11000
- 添加 1:11000 --> 11001
就是这样!在 5 位上,-7 由 11001 表示。
我不会介绍它,但 2 的补码的另一个巨大优点是加法的工作方式相同。也就是说,当两个二进制数相加时,您不必关心它们是有符号还是无符号,这与后面的算法相同。
有了这个,你应该能够回答问题,但更重要的是理解答案。
这个主题非常适合理解 2 的补码:为什么用补码来表示负数?