从逻辑角度来看:
有符号表示中的上下限
你有5位,因此有32种不同的组合。这意味着你可以用5位得到32个不同的数字。对于无符号整数,将0到31(含)之间的整数存储在5位上是有意义的。
然而,这涉及到有符号整数。也就是说:我们必须找到一种方法来表示负数。也就是说:我们必须存储数字的值,同时还要存储其符号(+或-)。所使用的表示法是二进制补码,它是到处都学到的一种表示法(也许还有其他的我不知道)。在这种表达方式中,符号由第一个位给出。也就是说,在二进制补码表示中,正数以0开始,负数以1开始。
问题就在这里:0是正数还是负数?它不能两者兼有,因为这意味着0在给定a位数的情况下可以用两种方式表示(对于5位:00000和10000),即我们失去了放置一个以上数字的空间。我不知道他们是如何决定的,但事实是0是正数。对于任何位数的有符号或无符号数,0都只用0表示。
好的。这给出了我们对第一个问题的答案:用二进制补码表示的十进制数的上限是多少?我们知道第一个位是符号位,因此所有我们可以表示的数字必须由4位组成。我们可以有16个不同的4位字符串值,0是其中之一,因此上限为15。
现在,对于负数,这变得很容易。我们已经填满了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)
二进制补码表示
现在,我们知道了哪些数字可以用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,您想知道它是多少十进制。
1. 反转所有位:10011 --> 01100
2. 加 1:01100 --> 01101
3. 把它当作无符号整数读取:01101 = 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 13。
10011 表示 -13。这种表示法非常方便,因为它可以双向工作。如何表示 -7 为二进制带符号整数?从二进制表示中开始 7,即00111。
1. 反转所有位:00111 --> 11000
2. 加 1:11000 --> 11001
就是这样!在 5 位上,-7 由 11001 表示。
我不会详细介绍,但 2 的补码的另一个巨大优势是加法的运作方式相同。也就是说,当添加两个二进制数时,您不必担心它们是有符号还是无符号,这是背后相同的算法。
有了这个,你应该能够回答问题,更重要的是理解答案。
深入了解 2 的补码,请参见此主题:
为什么使用二进制补码表示负数?