[计算机组成原理]--字节进制与补码介绍

来源:互联网 发布:手机淘宝上买东西教程 编辑:程序博客网 时间: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-210 是同余的.
(-4) mod 12 = 88 mod 12 = 8-48 是同余的.

可以看到我们只要找到两个数与基数同余,就可以使用正数去代替负数。

下面我们会运用同余数的两个定理:

定理一 :反身性aa (mod m)这个定理是很显而易见的.定理二 :线性运算定理如果 a ≡ b (mod m),c ≡ d (mod m) 那么:(1)a ± c ≡ b ± d (mod m)(2)a * c ≡ b * d (mod m)

运用上面的定理,我们可以看下面的一个例子

77 (mod 12)(-2) ≡ 10 (mod 12)7 -27 + 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-12+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-12+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

原创粉丝点击