回去又复习了一遍计算机里面二进制整数的表示方式,主要分为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