二进制整数及其表达方式

断了今生、忘了曾经 提交于 2019-11-29 10:12:50

回去又复习了一遍计算机里面二进制整数的表示方式,主要分为3类:原码、反码和补码。
当然,我还是要在开头说明一下,计算机里都是以补码的形式储存数据。

原码

这种方式最好理解,将我十进制的“逢十进一”换成二进制的“逢二进一”就行了。
具体如何做呢?还是介绍一下十进制和二进制的转换方式吧。

  • 二进制转换十进制

话不多说,直接写公式,“按权展开求和”:


  • 十进制转二进制

按照套路来,用"除2取余,逆序排列"的方法。
举个栗子:789转换成二进制
1.除二取余

计算 余数 位数
789/2=394 余1 第10位
394/2=197 余0 第9位
197/2=98 余1 第8位
98/2=49 余0 第7位
49/2=24 余1 第6位
24/2=12 余0 第5位
12/2=6 余0 第4位
6/2=3 余0 第3位
3/2=1 余1 第2位
1/2得0 余1 第1位

2.逆序排列余数得到结果
789=1100010101(B)
后面括号里的B代表该数为二进制

  • 计算机里为什么要用二进制码来表示数据

1、技术实现简单。计算机是由逻辑电路组成,逻辑电路通常只有两种状态,开关的接通和断开,正好用“0”“1”表示。
2、运算规则简单,两个二进制数的和、积运算组合简单。
3、适合逻辑运算,二进制只有两个数码,和逻辑代数中的“真”“假”相吻合。
4、易于进行转换,二进制和十进制数转换简单。
-----------摘自百度知道

对于原码,我觉得了解上面的就差不多了。

反码

顾名思义,反码其实就是把原码所有的位数反过来,1->0,0->1
这有什么用?为什么要这么做呢?
在此之前,我们先回答以下几个事实

  • 原码表示负数很困难
    你可以在电脑的很多地方看到负数运算吧?如果整数在计算机里都用原码来表示,负数怎么运算呢?这将是一个非常困难的话题。如果要达到这种效果,可能需要在硬件(运算器)的设计时,加入特定的记录和运算负数的功能,但设计到硬件这方面,问题会变得很麻烦,或者假如它被设计出来,最终应用到电脑上时性能也会大大减弱。引入反码,就是希望能够通过另一种编码形式,解决负数表示的问题。说到这你可能还是很疑问为什么这样反过来就可以表示负数了,不要急,我来逐步解决你的问题,先继续往下看。
  • 4个二进制位能表示的最大整数

你可能会觉得1111(B)就是最大的,按照我们之前在原码里介绍的方法,把它转化为十进制:
1111(B) = 15
问题来了,如果我们要表示负数呢?所以我们需要抽出一位来表示正负,也就是第一位,并且规定0为正,1为负(其实这也不能说是规定,它很神奇,事实就是这样)
既然有这个规定,我们能表示的最大整数就不能是255了,而是:
0111(B) = 7
那最小整数呢?是1111(B) = -7吗,错误!继续往下看,了解如何表示负数。
你可能会比较陌生这样的表示方法,但现在只要你记住有这样的规定就行。

  • 如何用反码表示整数(包括正负数)
    规则:十进制 > 二进制原码 > 二进制反码
    将十进制的绝对值转换为二进制原码,如果该数为整数,则不变(反码=原码),若该数为负数,则按位取反,得到反码。
    以下列表列出了0附近的几个反码(假如我们使用4个二进制位,表示负数一定要确定有多少个二进制位):
二进制反码 十进制整数
0101 5
0100 4
0011 3
0010 2
0001 1
0000 0
1111 0
1110 -1
1101 -2
1100 -3

从上面到下面,其实大部分还是很好理解的,反码每次-0001得到下面的数(这和十进制是一样的),但是我们注意到,有两个0。我们要讨论一下为什么0000-1111得到的还是0,其实仔细想想会发现确实是这样的,因为0可以看作是+0和-0,按照上面的规则,就有两种表示方法了。
那0000 - 0001 = 1111又是为什么呢?
这是因为溢出了,你可以理解为0000的前面有无数个1,在后一位不够的时候会向前一位借1(但是这个1是不会还的)。现在讨论溢出还早,这个理解起来有点麻烦。
你现在要知道,如何将十进制数转化为二进制反码表示,并且知道0可以有两种方法表示,就行了。

  • 一个字节表示的最小整数
    观察二进制反码的变化,你会发现反码表示正负数的形式,并不是我们想的那样:先用原码表示绝对值,然后前面加一个1或者0让他变成正或者负。所以这就是为什么之前你认为的“1111(B)是能够表示的最小整数”这句话是错的,因为它其实表示的是0。
    那如何得到最小整数呢?
    我们还是看上面列表里的规律吧,继续往下走,直到反码的后3位全部0,即1000(B)(第一位我们不能动,因为如果在此继续减下去,它将变成一个正数!在实际计算机里也是这样的),我们反向走一遍规则,将1000(B)转化为绝对值,就是1000(B) > 0111(B) > 7,因为它是负数,所以是-7,这就是4个二进制位能够表示的最小整数了。
  • 公式法得到反码
    想要用原码转换的方法得到一个数的反码吗?这样会让转换过程更加通用。看下面的公式:



    其中n为二进制位数,N为十进制数的绝对值
    假如我们将十进制-6用4个二进制位表示,那么n=4,N=6,公式得到N' = 9,然后用原码表示9就得到了二进制数:1001,它就是-6的反码了。


原文地址:https://www.jianshu.com/p/8314710ba093?from=singlemessage
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!