计算机组成.计算机的真与假.二进制
2016-05-09 17:43
375 查看
在我看来,计算机的二进制表示近乎神来之笔,虽然一位只有1和0两个值,要表示数据的时候也就需要更多的位来表示,但二进制带来的好处却大大超出这个弊端
1与0的简洁表示,使得很多问题的处理变得简单得多,越深入越深有体会
我大概不会深入太深,,,毕竟水平有限于课本
16进制表示毫无压力,一位足以表示10,也就是“a”
二进制表示压力很大,因为二进制是逢2进1,二进制下的“10”所表示的只是2而已,,,
给一张表吧
看吧,十进制的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
再给一张表
那么对于 X进制 下的某个数字 n,其实际的值(也就是我们常用十进制下的表示)是多少呢?
n 的最低位有 x 种变化
n 的次低位有 x 种变化
……
n的某一位要为1,那么这一位之前的所有位要遍历所有的表示方法,实在表示不了了,才交给更高的一位来表示,也就是进位
比如,二进制的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”表示负数,也和“补码”有一定关系
先给个表格,给定数字a从0000取到0111,-a表示a的相反数
先不看这个表格,给你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
超前进位加法器
乘法算法、布斯算法
/article/11881093.html
海明码
/article/11881092.html
之后打算复习
指令流与程序
流水线
/article/11881090.html
微程序与其原理
/article/11881089.html
总线控制
总线仲裁:集中(串行、定时查询、独立请求、固定时间片)分布(自举、并行竞争、冲突检测)
总线通信:同步和异步(单边、双边(不互锁、半互锁、全互锁))和半同步
主存
组成
提高带宽
Cache高速缓存
原理:局部性
两种结构(透过、旁观)与三大方面(地址映像与变换、替换算法、写入策略)
虚拟存储器
多道程序下的固定、可变分区管理
段式、页式管理
页式虚存(逻辑地址与物理地址、页表、快表…)
中断屏蔽
8259A中断控制器(我就问是不是典型的教材内容 hhh)
1与0的简洁表示,使得很多问题的处理变得简单得多,越深入越深有体会
我大概不会深入太深,,,毕竟水平有限于课本
二进制
如果说平时所用的十进制是逢10进1,也就是当9再增加的时候,就没有办法用一位来表示10,所以就向更高位进1,这也就是为什么10是写成“10”这样的原因16进制表示毫无压力,一位足以表示10,也就是“a”
二进制表示压力很大,因为二进制是逢2进1,二进制下的“10”所表示的只是2而已,,,
给一张表吧
十进制 | 二进制 |
---|---|
01 | 0001 |
02 | 0010 |
03 | 0011 |
04 | 0100 |
05 | 0101 |
06 | 0110 |
07 | 0111 |
08 | 1000 |
09 | 1001 |
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
再给一张表
十进制 | 二进制 | 十六进制 |
---|---|---|
01 | 00001 | 01 |
04 | 00100 | 04 |
09 | 01001 | 09 |
10 | 01010 | 0a |
14 | 01110 | 0e |
15 | 01111 | 0f |
16 | 10000 | 10 |
n 的最低位有 x 种变化
n 的次低位有 x 种变化
……
n的某一位要为1,那么这一位之前的所有位要遍历所有的表示方法,实在表示不了了,才交给更高的一位来表示,也就是进位
比如,二进制的10010表示的值是多少?
第4位 | 第3位 | 第2位 | 第1位 | 第0位 |
---|---|---|---|---|
1 | 0 | 0 | 1 | 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值 |
---|---|---|---|---|---|
0000 | 0 | 1111 | 0000 | 0000 | 0 |
0001 | 1 | 1110 | 0001 | 1111 | -1 |
0010 | 2 | 1101 | 0010 | 1110 | -2 |
0011 | 3 | 1100 | 0011 | 1101 | -3 |
0100 | 4 | 1011 | 0100 | 1100 | -4 |
0101 | 5 | 1010 | 0101 | 1011 | -5 |
0110 | 6 | 1001 | 0110 | 1010 | -6 |
0111 | 7 | 1000 | 0111 | 1001 | -7 |
如果这样也就没有负数的容身之地了,所以我们让出一位最高位来表示符号的话,剩下了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)
相关文章推荐
- Android OkHttp完全解析 是时候来了解OkHttp了
- 简析TCP的三次握手与四次分手
- delphi使用IdHTTP模拟提交页面方法总结
- NodeJS学习笔记之Http模块
- nodejs http 发送请求
- Nodejs获取网络数据并生成Excel表格
- 《网络游戏服务器编程》
- Delphi IDhttp 获取Cookie
- Linux服务器利用Nethogs监控每个进程的网络使用情况
- 嵌入式计算机和物联网,嵌入式究竟是什么?
- [置顶] KMeans算法检测网络异常入侵
- TCP/IP协议学习之TCP、IP篇
- delphi的idhttp的get 和 post的使用
- 网络编程知识(2)--Socket理解
- [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
- HTTP gzip和deflate的几点区别
- OkHttp+ Retrofit使用从0开始(一)
- 返回内部类网络判断的状态
- 数据结构-队列(queue)
- 计算机视觉领域的一些牛人博客,研究机构等的网站链接