[计算机组成原理]--字节进制与补码介绍
来源:互联网 发布:手机淘宝上买东西教程 编辑:程序博客网 时间:2024/06/06 13:03
一些其他的
最近自己也是挺忙的,一直没有来得及更新博客,今天再来更新一下计算机组成原理的内容。之后就慢慢更新吧。
自己最近的话会做两个自己的网站,一个是个人的博客,内容会比 csdn 上的多一些,比较 csdn 上只能放一些关于科技类的。还有一个是关于数学的网站,那个也是我的一个个人的喜好的,会做一下图形话数学,就是用图形的语言把一些数学知识定理描述出来。
一些零碎的东西我会在个人博客上先发,然后转发到这里,而数学可视化,我应该只会定期在这里发一下目录,简介,具体内容还希望大家去我的网站上查看。具体网址见下面。
下面把这两个网站的网址放在下面,大家可以去看看提供一下意见。
两个网站
个人博客:www.wangmn.cn
数学学习:www.mathpretty.com
第一部分–比特字节和进制
比特和字节
Bit,比特,也叫二进制位,是信息的最小单位。一个比特可以理解为一个开关量,0 就是关,1 就是开。
Byte,字节,由 8 个 Bit 组成。它通常用作计算机信息计量单位。字节在一些规范中称作 Octet。
Bit 简写为 b,Byte 简写为 B。
常用的进制
注意什么时候用 2^x,什么时候用 10^x。下面给出一个小小的总结:
在计算机科学领域采用 1024 进制,在信息技术领域(计算机网络),采用 1000 进制。
1k = 2^10 = 10^31M = 2^20 = 10^61G = 2^30 = 10^91T = 2^40 = 10^12
例子
为了更好理解上面关于进制的知识,下面我们举一个例子。
我们下面可以看一个关于硬盘容量的例子。
涉及到硬盘、文件等存储类的信息,都以字节为单位。
举个栗子:买了 2T 的硬盘,为毛放到计算机上少了那么多?
因为硬盘的进制是 1000,2TB 的硬盘,实际是 2000GB,以此类推。计算机统计的进制是采用 1024。
所以,2TB 实际容量是 2*1000^4(B)/1024^4,约为 1.189T(1862G,这一换算直接少了 140G 啊)。
参考资料
比特字节与进制
第二部分–原码反码和补码
原码反码和补码的定义
原码:符号位加真值的绝对值。反码:正数的反码是其原码。 负数的反码,符号位不变,其余各位取反,即 1 变成 0,0 变成 1。补码:正数的的补码是其原码。 负数的补码,是其反码 + 1。
下面我们来看一个例子
+3[补] = 00000011[原] = 00000011[反] = 00000011[补]-3[反] = 10000011[原] = 11111100[反] = 11111101[补]
为什么使用反码和补码
原码比较直观,它的数值部分就是该数的绝对值,而且与真值、十进制数的转换十分方便。
但是它的加减法运算较复杂(原码的计算符号位不能直接参与运算)。当两数相加时,机器要首先判断两数的符号是否相同,如果相同则两数相加,若符号不同,则两数相减。在做减法前,还要判断两数绝对值的大小,然后用大数减去小数,最后再确定差的符号。
换言之,用这样一种直接的形式进行加运算时,负数的符号位不能与其数值部分一同参加运算,而必须利用单独的线路确定和的符号位。要实现这些操作,电路就很复杂。
为了减少设备,解决机器内负数的符号位参加运算的问题,总是将减法运算变成加法运算,引进了反码机器数,可以让符号位直接参与计算,把它统一看做无符号数。
-3 + 2 = 11111100[反] + 00000010[反] = 11111110[反] =10000001[原] = -1
看似挺好,但也会出问题。
3 - 2 = 3 + (-2) = 00000011[反] + 11111101[反] = 00000000[反] = 00000000[原] = 0
为了解决上面反码的问题,我们引入了补码。
-3 + 2 = 11111101[补] + 00000010[补] = 11111111[补] = 11111110[反] = 10000001[原] = -13 + (-2) = 00000011[补] + 11111110[补] = 00000001[补] = 00000001[原] = 11 + (-1) = 00000001[补] + 111111111[补] = 00000000[补] = 00000000[原] = 0
注意:补码的范围是 [-128,127],因为在原码中 0 有两个表示方法,即 + 0 和 - 0,但是在补码里,0 只有一种表示方式00000000
补码的取值范围是 [-2^n-1, (2^n-1) - 1],可以表示最多的整数,而且符号位参与运算不会出错。
补码的数学原理
首先我们要介绍两个概念,同余(两个数对同一个数做除法有相同的余数)和取模(要注意负数的取模)。
同余
首先说一下关于同余和其符号:
若 x mod z = y mod z,那么称 x, y 关于 z 同余,记为 x ≡ y (mod z)。
取模
再说一下关于取模(后面会用到负数取模)
正数取模,易于理解。
5 mod 3 = 2
负数取模,要理解取模运算的数学定义。
x mod y = x - y * floor(x/y)
其中 floor(x) 称为向下取整函数,表示不超过 x 的最大整数。
举个栗子:
-5 mod 3 = -5 - 3 * floor(-5 / 3) = -5 - 3 * floor(-1.6666...)= -5 - 3 * (-2) = 1
所以 - 5 mod 3 = 1
接下来来说一下补码的数学原理。我找了两个版本的解释,第一个详细一些,第二个省略一些,他们关于膜的大小不一样,我还没去查证过,但是第一个看完比较好理解。
版本一
将钟表想象成是一个 1 位的 12 进制数. 如果当前时间是 6 点, 我希望将时间设置成 4 点, 需要怎么做呢?
我们可以:
1. 往回拨 2 个小时: 6 - 2 = 42. 2. 往前拨 10 个小时: (6 + 10) mod 12 = 43. 往前拨 10+12=22 个小时: (6+22) mod 12 =4
所以钟表往回拨 (减法) 的结果可以用往前拨 (加法) 替代!现在的焦点就落在了如何用一个正数, 来替代一个负数 。
我们再看刚刚的例子,可以看到如下的一些规律:
回拨 2 小时 = 前拨 10 小时回拨 4 小时 = 前拨 8 小时回拨 5 小时 = 前拨 7 小时
结合上面同余的概念,我们可以得到如下的信息:
下面往回拨代表是负数,前拨代表是正数(-2) mod 12 = 1010 mod 12 = 10-2 与 10 是同余的.
(-4) mod 12 = 88 mod 12 = 8-4 与 8 是同余的.
可以看到我们只要找到两个数与基数同余,就可以使用正数去代替负数。
下面我们会运用同余数的两个定理:
定理一 :反身性a ≡ a (mod m)这个定理是很显而易见的.定理二 :线性运算定理如果 a ≡ b (mod m),c ≡ d (mod m) 那么:(1)a ± c ≡ b ± d (mod m)(2)a * c ≡ b * d (mod m)
运用上面的定理,我们可以看下面的一个例子
7 ≡ 7 (mod 12)(-2) ≡ 10 (mod 12)7 -2 ≡ 7 + 10 (mod 12)
现在我们为一个负数, 找到了它的正数同余数. 但是并不是 7-2 = 7+10, 而是 7 -2 ≡ 7 + 10 (mod 12) , 即计算结果的余数相等.
接下来回到二进制的问题上, 看一下: 2-1=1 的问题.
2-1=2+(-1) = [0000 0010] [原] + [1000 0001] [原] = [0000 0010] ]反] + [1111 1110] [反]
先到这一步, -1 的反码表示是 1111 1110. 如果这里将 [1111 1110] 认为是原码, 则 [1111 1110] [原] = -126, 这里将符号位除去, 即认为是 126. 发现有如下规律:
(-1) mod 127 = 126126 mod 127 = 126即:(-1) ≡ 126 (mod 127)2-1 ≡ 2+126 (mod 127)
2-1 与 2+126 的余数结果是相同的! 而这个余数, 正是我们的期望的计算结果: 2-1=1。所以说一个数的反码, 实际上是这个数对于一个膜的同余数. 而这个膜并不是我们的二进制, 而是所能表示的最大值!
这就和钟表一样, 转了一圈后总能找到在可表示范围内的一个正确的数值!
而 2+126 很显然相当于钟表转过了一轮, 而因为符号位是参与计算的, 正好和溢出的最高位形成正确的运算结果.
既然反码可以将减法变成加法, 那么现在计算机使用的补码呢? 为什么在反码的基础上加 1, 还能得到正确的结果?
2-1=2+(-1) = [0000 0010] [原] + [1000 0001] [原] = [0000 0010] [补] + [1111 1111] [补]
如果把 [1111 1111] 当成原码, 去除符号位, 则:[0111 1111] [原] = 127
其实, 在反码的基础上 + 1, 只是相当于增加了膜的值:
(-1) mod 128 = 127127 mod 128 = 1272-1 ≡ 2+127 (mod 128)
此时, 表盘相当于每 128 个刻度转一轮. 所以用补码表示的运算结果最小值和最大值应该是 [-128, 128]. 但是由于 0 的特殊情况, 没有办法表示 128, 所以补码的取值范围是 [-128, 127]
版本二
先说结论:补码对应的无符号整数与真值是关于 256(=2^8) 同余。
正数和 0 的补码对应的无符号整数等于其真值,所以也同余。
关于负数,举个栗子。
-3 = 11111101[补] 而 11111101 作为无符号二进制的值是 253。
-3 mod 256 = -3 - 256 * floor(-3/256) = -3 - 256 * (-1) = 253253 mod 256 = 253
所以 -3 ≡ 253 (mod 256)。
进一步的结论,在 8 位机中,计算机的循环计数周期为 256,符号位参与运算,即将其当做无符号数进行运算后的结果,实际是把真值对 256 取模。在原码、反码、补码中,只有补码对应的无符号数与真值是关于 256 同余的,所以用补码的形式表示数字是符合数学原理的。
参考资料
原码反码和补码
以上,所有
2017 / 9 / 9
- [计算机组成原理]--字节进制与补码介绍
- 计算机组成原理---为什么计算机中要使用补码?
- 以考带学计算机组成原理(进制与编码)
- 计算机组成原理实验三:二进制补码加法器
- 计算机组成原理之原码、补码、反码和移码
- 计算机组成原理之原码、补码、反码和移码
- 计算机组成原理实验二:四位补码运算器
- 计算机组成原理实验三:二进制补码加法器
- 关于计算机组成原理与单片机原理
- 【计算机组成原理】主板与总线
- 《计算机组成与原理》读书笔记1
- 《计算机组成与原理》读书笔记2
- 《计算机组成与原理》读书笔记3
- 《计算机组成与原理》读书笔记4
- 《计算机组成与原理》读书笔记5
- 《计算机组成与原理》读书笔记6
- 计算机组成原理与体系结构---Flynn分类法
- 计算机组成原理与体系结构---流水线
- pageX- clientX- screenX-区别
- Trasform属性学习-Css3
- 欢迎使用CSDN-markdown编辑器
- select,poll,epoll函数
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛C. Coconut
- [计算机组成原理]--字节进制与补码介绍
- 《第一行代码》RecyclerView学习笔记
- 基于UDP协议可靠传输协议QUIC协议和golang server代码和client代码
- Vue-js安装
- 百度地图测量两点间距离(行车距离)
- IE浏览器url带中文参数导致乱码问题(chrome下正常)
- Homebrew
- Java 的 标识符 和 数据类型
- EditText