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

Whats the highest and the lowest integer for representing signed numbers in two's complement in 5 bits?

我了解二进制的工作原理并且我可以将二进制计算为十进制,但我对有符号数一头雾水。 我找到了一个可以进行转换的 calculator。但我不确定如何找到最大值和最小值,或者如果未给出二进制数则如何转换,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).

看来我必须更深入地了解二进制概念,我只有 2 个月的编程时间,我以为我知道二进制转换。

从逻辑的角度:

有符号表示的边界

你有5位,所以有32种不同的组合。这意味着您可以用 5 位组成 32 个不同的数字。对于无符号整数,将 0 到 31(含)的整数存储在 5 位上是有意义的。

但是,这是关于无符号整数的。意思是:我们也必须找到一种表示负数的方法。含义:我们必须存储数字的值,以及它的符号(+ 或 -)。使用的表示是 2 的补码,这是随处可见的补码(也许还有其他的,但我不知道)。在此表示中,符号由第一位给出。也就是说,在 2 的补码表示中,正数以 0 开头,负数以 1 开头。

问题来了:0是正数还是负数?不能两者都是,因为这意味着 0 可以用两种方式表示给定数字 a 位(对于 5:00000 和 10000),也就是说我们失去了 space 来放置一个数字。我不知道他们是怎么决定的,但事实是 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,您想知道小数是多少。

  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 的补码非常有用:Why is two's complement used to represent negative numbers?