Math 表示两个';是5位补码吗?

Math 表示两个';是5位补码吗?,math,binary,bit,bits,twos-complement,Math,Binary,Bit,Bits,Twos Complement,我知道二进制是如何工作的,我可以计算二进制到十进制,但我对有符号数字一无所知。 我找到了一个进行转换的。但我不知道如何找到最大值和最小值,或者在没有给出二进制数的情况下如何转换,StackO中的问题似乎是关于转换特定的数字,或者不包括有符号的数字到特定的位 具体问题是: We have only 5 bits for representing signed numbers in two's complement: What is the highest signed integer? Wri

我知道二进制是如何工作的,我可以计算二进制到十进制,但我对有符号数字一无所知。 我找到了一个进行转换的。但我不知道如何找到最大值和最小值,或者在没有给出二进制数的情况下如何转换,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).

看来我必须更深入地学习二进制概念,我只有两个月的编程时间,我想我知道二进制转换。

从逻辑的角度来看:

有符号表示的界限

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

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

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

    非常好。建议,“移位所有位”可能与左移位或右移位操作混淆。可能是flip,或者维基百科使用invert。