您的位置:首页 > 理论基础

计算机组成.计算机的真与假.二进制

2016-05-09 17:43 375 查看
在我看来,计算机的二进制表示近乎神来之笔,虽然一位只有1和0两个值,要表示数据的时候也就需要更多的位来表示,但二进制带来的好处却大大超出这个弊端

1与0的简洁表示,使得很多问题的处理变得简单得多,越深入越深有体会

我大概不会深入太深,,,毕竟水平有限于课本

二进制

如果说平时所用的十进制是逢10进1,也就是当9再增加的时候,就没有办法用一位来表示10,所以就向更高位进1,这也就是为什么10是写成“10”这样的原因

16进制表示毫无压力,一位足以表示10,也就是“a”

二进制表示压力很大,因为二进制是逢2进1,二进制下的“10”所表示的只是2而已,,,

给一张表吧

十进制二进制
010001
020010
030011
040100
050101
060110
070111
081000
091001
101010
看吧,十进制的10在二进制的表示下要写成“1010”

追溯一下内在规律,所谓的进制

进制规则的内在规律

叙述中的数字若无特殊说明则为正常的十进制,,,嘿嘿嘿(●ˇ∀ˇ●)

当我们说X进制的时侯,其实是说我在这种X进制的表示下,一位可以有多少种表示

十进制里,每一位可以表示10种,即0、1、2、3、4、5、6、7、8、9

二进制里,每一位可以表示2种,即0和1

十六进制里,除了十进制的10种外,顺次增加了a,b,c,d,e,f来表示10,11,12,13,14,15

再给一张表

十进制二进制十六进制
010000101
040010004
090100109
10010100a
14011100e
15011110f
161000010
那么对于 X进制 下的某个数字 n,其实际的值(也就是我们常用十进制下的表示)是多少呢?

n 的最低位有 x 种变化

n 的次低位有 x 种变化

……

n的某一位要为1,那么这一位之前的所有位要遍历所有的表示方法,实在表示不了了,才交给更高的一位来表示,也就是进位

比如,二进制的10010表示的值是多少?

第4位第3位第2位第1位第0位
10010
X进制下所表示的值n即为 X进制下每一位的值 * X的“这一位所在的位数(从0计数)”次幂

对于刚刚的 二进制10010 的值n

n=1∗24+0∗23+0∗22+1∗21+0∗20 n = 1*2^4+0*2^3+0*2^2+1*2^1+0*2^0

n=18 n = 18

也就是说二进制的10010表示为十进制就是18,值也就是18

如此一来不同进制之间的转换规律也就呼之欲出了,撇下十六进制,只讲十进制与二进制的转换

表示方法规范化一下

对于一个十进制数字n,(n1)x表示n1为n在x进制下的表示

如十进制数字8,(8)10的意思是8在十进制的表示下为“8”这个样子,(1000)2则表示8在二进制表示下位“1000”这个样子

显然,(8)10 = (1000)2,也就是虽然表示形式不同,但实际的值相同,都是你的手指头个数减去二。

十进制转换成二进制

给一个十进制数字n求其在二进制下的表示n1,也就是使得 (n)10 = (n1)2

表示形式尽管不同,但实际的值是相同的

要求得n1的表示,也就是求得n1的每一位是多少

用w0来表示n1的第0位,依次类推

n=w0∗20+w1∗21+w2∗22......n = w0*2^0 + w1*2^1 + w2*2^2 ......

就算凑数,也很容易可以求得w0,w1等等的值,也就求出了n1的表示

等等?这个等式不是无穷位嘛,那怎么可能解得出来?

来我们算一个,比如 (12)10 = (n1)2

二进制下每一位只能是1和0,也就是所有的w都只能取值1或0

12=w0∗20+w1∗21+w2∗22+w3∗2312 = w0*2^0 + w1*2^1 + w2*2^2 + w3*2^3

哎,我怎么写到w3就不继续写了呢?如果继续写w4的话

w4∗24 w4*2^4

2^4=16>12,所以w4再往上w5、w6都只能是0,,,so,,,,,,wo don’t need ‘w4’

于是得出了w0 = 0,w1 = 0,w2 = 1,w3 = 1

于是二进制下的“1100”就表示十进制下的“12”

我敢说十进制转换成任意进制都可以这样算

对于一个十进制数字n,要转换成X进制下的表示n1

即(n)10 = (n1)x

对于n1的每一位用w0、w1等等来表示

n=w0∗X0+w1∗X1+w2∗X2+......n = w0*X^0 + w1*X^1 + w2*X^2 + ......

解方程吧

但是!!!!!!!!!

算起来可麻烦,于是就有各种方法来简化我们解方程的过程,但内在的规律都是这样

方法自行谷歌百度,大多都是除取余数,对应上内在的规律应该看得更容易一点

二进制转换十进制

看完了上面的我就不信你不会,当然如果我写得烂,,,那怪我,,

(n1)2 = (n)10

对于二进制下的n1用w0、w1等表示其每一位(均已知)

n=w0∗20+w1∗21+....n = w0*2^0 + w1*2^1 + ....

十进制小数与二进制小数

给一个很对称的规律,详细的不讲了

因为只讨论小数,所以用n和n1分别表示十进制和二进制的小数部分

比如十进制的2.5,其小数部分就是“0.5”,3.123对应“0.123”

用w0表示n1小数部分的最高位,w1表示次高位,,,比如二进制“0.011”有w0=0,w1=1,w2=1

那么

n=w0∗2−1+w1∗2−2+......n = w0*2^{-1} + w1*2^{-2} + ......

所以二进制的“0.011”表示十进制的“0.375”

计算机的二进制

计算机是不表示小数点的,所以只默认实现“定点整数”或“定点小数”中一种来表示数据

默认你们都懂1Byte = 8bit等等基础概念了啊,,,我也就是写着玩,还不一定有人看呢=、=

定点整数:只记录整数部分,即10101010表示为10101010.0

定点小数:只记录小数部分,即10101010表示为0.10101010

计算机在制作的时候就选择一种来实现,一般都是定点整数吧

其实我也不太懂这样的区分有何意义,,,,,,巴拉巴拉能量,,,跳过不讲

其次还有符号,即正与负的关系

最高位作为符号位,0表示正,1表示负

0000 0001 表示 +1

1000 0001 表示 -1

然而这只是“原码”,说起来为何最高位“1”表示负数,也和“补码”有一定关系

原码、补码和反码

为了省事我就用 4bit 来举例

先给个表格,给定数字a从0000取到0111,-a表示a的相反数

a原码a值a原码取反a反码-a补码-a值
000001111000000000
00011111000011111-1
00102110100101110-2
00113110000111101-3
01004101101001100-4
01015101001011011-5
01106100101101010-6
01117100001111001-7
先不看这个表格,给你4bit,那么4bit可以表示2^4=16也就是16个数,从0000表示0到1111表示15,这是很自然的想法

如果这样也就没有负数的容身之地了,所以我们让出一位最高位来表示符号的话,剩下了3bit可以用来表示数值,也就是0-7,对应0000表示0到0111表示7

问题1:那为什么要有补码?直接用1001表示-1不行吗?

当然可以!为什么不行,这样表示对我们来说更直观啊

但是对于计算机而言,负数更直观的表示应当是“正数的对立面”“正数的相反”

什么样的数才是“正数的相反”呢?也就是和正数相加为零的数

比如3和-3,表中0011表示3,1101表示-3,以二进制的形式每位相加的话,0011+1101=1 0000,而多出来的1实际上超过了4bit的范围,于是在计算机的计算下,0011 + 1101 = 0000

所以我们说对于计算机而言,“1101”和“0011”相加为0,既然“0011”表示3,那么自然而然就用“1101”来表示-3

补码是怎么算的呢?

仅看表的话很容易发现一个规律,那就是对于正数a来说,-a的补码总是等于a的原码每位取反再+1。

而实际上我们规定,对于正数来讲,其原码=反码=补码

对于负数,反码=原码取反,补码=原码取反+1=反码+1

问题2:细心的人可能发现:

1000没有在表中???!!!!

的确1000在表中并未编码,而按照我们赋予的“最高位为1表示负数”的概念,我们认为1000表示-8

如此一来“1000”+“0001”=“1001”刚好是 -8 +1 = -7

细数一下补码的好处

我们有地方来表示负数了~~

相加的时候直接每位相加即可得出正确答案,而不必关心正负

对于特殊的0来说,如果按照我们人类的直观表示,“0000”和“1000”分别表示+0和-0,,,,,,两个零并没有什么意义,,,,,,而补码就避免了这个问题

问题3:如果我们用最高位为1来表示负数,那么在“大小比较”的时候,计算机比较笨,总是认为1大于0,那么按每一位来比较的话负数岂不是总是大于正数了?

比如按位比较下,“1111”要大于“0001”,就是说“-1”大于“1”,这可不行

(为什么要按位比较,,因为计算机实现起来容易,,把,,)

于是出现了移码

比较的时候我们给每个数的最高位取反,这样正数的最高位就变成了1,负数最高位就变成了0,比较起来的话原本“-1”的“1111”变成了“0111”和“1”的“0001”变成的“1001”比较,自然是“1001”大于“0111”也就是“1”大于“-1”。

啊哈,普弱不乐母扫屋的。

快考试了,我想挑战一下自己,把所有复习的笔记用自己的思路结合计算机体系结构的内容都整理到CSDN上,,有点难啊,,接下来搞定

浮点数

科学计数法与浮点数

规格化

IEEE标准

http://m.blog.csdn.net/article/details?id=51364425

运算与ALU

逻辑、加减乘除

超前进位加法器

乘法算法、布斯算法

/article/11881093.html

错误检验与数据纠错码

奇偶校验

海明码

/article/11881092.html

之后打算复习

处理器与指令流

组成

指令流与程序

流水线

/article/11881090.html

控制器

三级时序

微程序与其原理

/article/11881089.html

总线

单总线多总线层次总线

总线控制

总线仲裁:集中(串行、定时查询、独立请求、固定时间片)分布(自举、并行竞争、冲突检测)

总线通信:同步和异步(单边、双边(不互锁、半互锁、全互锁))和半同步

存储器

SRAM和DRAM

主存

组成

提高带宽

Cache高速缓存

原理:局部性

两种结构(透过、旁观)与三大方面(地址映像与变换、替换算法、写入策略)

虚拟存储器

多道程序下的固定、可变分区管理

段式、页式管理

页式虚存(逻辑地址与物理地址、页表、快表…)

中断控制

中断

中断屏蔽

8259A中断控制器(我就问是不是典型的教材内容 hhh)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: