在5位二进制补码中,表示有符号数的最高和最低整数是多少?

4
我了解二进制的工作原理,能够将二进制转换为十进制,但是在有符号数方面我感到困惑。我找到了一个计算器能够进行转换。但我不确定如何找到最大值和最小值,或者在没有给定二进制数的情况下进行转换,而且StackO上的问题似乎只涉及转换特定数字或不包括带符号数到特定位数的转换。
具体问题是:
We have only 5 bits for representing signed numbers in two's complement:

What is the highest signed integer? 
Write its decimal value (including the sign only if negative).

What is the lowest signed integer? 
Write its decimal value (including the sign only if negative).

看来我需要更深入地了解二进制概念了,我刚刚学了两个月编程,以为自己已经掌握了二进制转换。

1个回答

6

从逻辑角度来看:

有符号表示中的上下限

你有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 的补码,请参见此主题:为什么使用二进制补码表示负数?

非常好。建议,“Shift all the bits” 可能会与左移或右移操作混淆。也许可以使用 flip,或者维基百科使用 invert。 - foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接