什么是最高和最低整数,用于表示2位补码中5位的有符号数?

Noo*_*lhu 3 math binary bits bit twos-complement

我理解二进制是如何工作的,我可以计算二进制到十进制,但我在签名数字周围丢失了.我找到了一个可以进行转换的计算器.但我不确定如何找到最大值和最小值或转换如果没有给出二进制数,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).
Run Code Online (Sandbox Code Playgroud)

好像我必须在二进制概念上更重,我只有2个月的编程,我以为我知道二进制转换.

T. *_*rie 6

从逻辑的角度来看:

签名代表的边界

你有5位,所以有32种不同的组合.这意味着您可以使用5位制作32个不同的数字.在无符号整数上,将0到31(包括)的整数存储在5位上是有意义的.

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

问题出现了:0是正数还是负数?它不能同时存在,因为它意味着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,您想知道小数是多少.

  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的补码:为什么二补数用于表示负数?