计算机常用的机器码及其特点,计算机体系结构(一):计算机科学基础拾遗

一、数制及其转换

1.1 计算机中常用的数制

在计算机中,常见的进制有二进制、八进制、十进制、十六进制。

1.1.1 十进制

基数为 10,逢十进一,数字位的表示从 0 到 9,进制表示符号为 D,如“12.3”按照位权展开:(12.3)10=1×10^1+2 ×10^0+3×10^-1=12.3D。

采用位置计数法,十进制按位权展开规律如下:整数部分

某数位对应的位权值是当前位值乘上以基数为底的幂,幂中指数为当前数位到小数点之间的数值个数(正数且不包含当

前位),即位权值=位值×基数离小数点的数位个数,如(634.57)10 中整数部分位权值依次是:6×10^2、3×10^1、4×10^0。小数部分

某数位对应的位权值是当前位值乘上以基数为底的幂,幂中指数为当前数位到小数点之间的数值个数(负数且包含当前

位),即位权值=位值×基数-离小数点的数位个数,如(634.57)10 中小数部分位权值依次是:5×10^-1、7×10^-2。合并

将整数部分和小数部分的位权值相加即为原数的位权展开式,如(634.57)10 的位权展开式为 6×10^2+3×10^1+4×10^0+5 ×10^-1+7×10^-2,即(634.57)10=6×10^2+3×10^1+4×10^0+5×10^-1+7×10^-2=634.57D。

位置计数法不仅仅适用于十进制数,同样适用于二进制、八进制和十六进制,只需要将幂中的底数改成相应的数制基数即可。

1.1.2 二进制

基数为2,数字位符号只有0和1,逢二进一,进制表示符号为 B,如“11.1”按照位权展开:(11.1)2=1×2^1+1×2^0+1×2^-1=11.1B。

1.1.3 八进制

基数为8,逢八进一,数字为的表示从0-7,,进制表示符号为 O,如“11.1”按照位权展开:(11.1)8=1×8^1+1×8^0+1×8^-1=11.1O

1.1.4 十六进制

基数为 16,逢十六进一,数字位的表示从 0 到 9,10 用 A 表示,以此类推 11 为 B,12 为 C,13 为 D,14 为 E,15 为 F,进制表示符号为 H,如“4FD”按照位权展开:(4FD)16=4×16^2+15×16^1+13×16^0=4FDH

1.2 不同数制间的转换

1.2.1 二、八、十六进制转换为十进制

其他进制转换为十进制采用的是位置计数法。如下图所示:

f1705fe1421e59736c51d2f26c79b74c.png

1.2.2 十进制转其他进制

十进制转换为其他进制,将十进制数及其商连续除目标进制的基数(除数为0时停止),最后将余数从下往上连续写出来便构成十进制对应的其他进制数,过程如图所示。在图中,127D=1111111B,127D=177O,127D=7FH。

9e9ed4a37434c4c902e93c51396eb3ea.png

1.2.3 八进制转换为二进制

用一位拆三位法,如(7.2)8=111.010B

1.2.4 十六进制转换为二进制

用一位拆四位法,如(7.2)16=111.0010H

1.2.5 二进制转八进制、十六进制

转八进制用三位合一位法

转十六进制用四位合一位法

二、数据的表示

各种数值在计算机中表示的形式称为机器数,其特点是采用二进制计数制,数的符号用 0,1 表示,小数点则隐含表示而不占位置。机器数对应的实际数值称为数的真值。

机器数有无符号数和有符号数之分。无符号数表示正数,在机器数中没有符号位。对于无符号数,若约定小数点的位置在机器数的最低位之后,则是纯整数;若约定小数点的位置在机器数的最高位之前,则是纯小数。对于有符号数,机器数的最高位是表示正、负的符号位,其余位则表示数值。若约定小数点的位置在机器数的最低数值之后,则是纯整数;若约定小数点的位置在机器数的最高数值位之前(符号位之后),则是纯小数。

为了便于运算,有符号的机器数可采用原码、反码和补码等不同的码制方法,机器数的这些编码方法称为码制。

2.1 数的机器码表示这里假设机器字长为 n 位,即有符号数用 n 个二进制位表示,最高位为符号位(0 表示正数,1 表示负数),其余 n-1 位为数值的绝对值。以下的码制讲解都假设机器字长为 8 位。

机器字长:机器字长也就是运算器进行定点数运算的字长,通常也是 CPU 内部数据通路的宽度。即字长越长,数的表示范围也越大,精度也越高。机器的字长也会影响机器的运算速度。倘若 CPU 字长较短,又要运算位数较多的数据,那么需要经过两次或多次的运算才能完成,这样势必影响整机的运行速度

2.1.1 原码特点:二进制定点表示的一种方法,符号位0表示正数,1表示负数,其余位表示数值的大小

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:

[1111 1111 , 0111 1111]

[-127 , 127]

2.1.2 反码特点:正数的反码是其本身,负数的反码是对它的原码(除符号位外)各自取反。[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反复制代码

2.1.3 补码特点:正数的补码与原码一样,负数的补码是其反码尾部加1[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补复制代码

2.1.4 移码特点:移码表示法是在数x上增加一个偏移量来定义,通常用于表示浮点数的阶码。如果机器字长为n,规定偏移量为2^n-1,则移码定义如下: X 为纯整数:[X]移=2n-1+X(-2n-1≤X<2n-1)

 X 为纯小数:[X]移=1+X(-1≤X<1)复制代码

例如:[+1]移=28-1+1=129=1 0000001 [-1]移=28-1-1=127=0 1111111 [+127]移=28-1+127=255=1 1111111

[-127]移=28-1-127=1=0 0000001 [+45]移=28-1+45=173=1 0101101 [-45]移=28-1-45=83=0 1010011

[+0.5]移=1+0.5=1.5=1 1000000 [-0.5]移=1-0.5=0.5=0 1000000 [+0]移=[-0]移=1 0000000复制代码

2.1.5 原码、反码、补码来源与作用原码:对于计算机,加减乘除是最基础的运算,要设计的尽量简单。计算机辨别“符号位”显然会让计算机的基础电路设计变得十分复杂!于是科学家想出了将符号位也参与运算的方法。我们知道,根据运算法则减去一个正数等于加上一个负数,即:1-1=1+(-1)=0,所以机器可以只有加法而没有减法,这样计算机运算的设计就更简单了。在运算中,原码进行加法运算是没有问题的,但是在减法运算中会出问题,如:1D-1D=1D+(-1)D=[0 0000001]原+[1 0000001]原=[1 0000010]原=-2D,这个结果明显是错误的!如果用原码表示,让符号位也参与计算,显然对于减法来说,结果是不正确的。这也就是为何计算机内部不使用原码表示一个数的原因。为了解决原码做减法的问题,出现了反码。

反码:使用反码计算1-1 过程:1-1 =[0000 0001]原 +[1000 0001]原 =[0000 0001]反+[1111 1110]反=[1111 1111]反 =[1000 0000]原= -0 。虽然+0 和-0 是一样的,但这里0带符号是没任何意义的而且会有两个+0 和-0 都表示0。于是人们就想出了补码。

补码:1D-1D=1D+(-1)D=[0000 0001]原+[1000 0001]原=[0000 0001]补+[1111 1111]补=[0000 0000]反=[0000 0000]原=0D,这样 0 用 00000000 表示,而以前出现问题的-0 则不存在了,且在补码中 0 也只有一种唯一的表示形式。假设机器字长为 8 位,使用补码可以用[1 0000000]补表示-128D: (-1)D+(-127)D=[1000 0001]原+[1 111 1111]原=[1 111 1111]补+[1 000 0001]补=[1 000 0000]补,最终运算结果应为“[1 1000 0000]补”,但由于机器字长为 8 位,最左边的“1”被丢掉了,故只剩下[1 0000000]补。 -1-127 的结果应该是-128,在用补码运算的结果中,[1 0000000]补就是-128。但是注意因为实际上是使用以前的-0 的补码来表示-128,所以-128 并没有原码和反码表示(对-128 的补码表示[1 0000000]补算出来的原码是[0 0000000]原,这是不正确的)。使用补码,不仅仅修复了 0 的符号以及 0 的两个编码的问题,而且还能够多表示一个最低数。这就是为什么 8 位二进制使用原码或反码表示的范围为[-127,+127],而使用补码表示的范围为[-128,127]的原因。因为机器使用补码,所以对于编程中常用到的 32 位 int 类型,可以表示范围是(最高位是符号位):[-2^31,2^31-1],使用补码表示时可以多保存一个最小值-2^31。假设机器字长为 n 位,则使用补码表示的最小的一个数是-2^n-1。

总之,反码用来解决负数加法运算问题,将减法运算转换为加法运算,从而简化运算规则;补码解决负数加法运算正负零问题,弥补了反码的不足。反码与补码都是为了解决负数运算问题,跟正数没关系,因此,不管是正整数还是正小数,原码,反码,补码都全部相同。将补码符号位取反即得到相应的移码。

2.2 定点数和浮点数

所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。通常将定点数据表示成纯小数或纯整数,为了将数表示成纯小数,通常把小数点固定在数值部分的最高位之前;而为了将数表示成纯整数,则把小数点固定在数值部分的最后面,如下图所示:

dd78c7e61383b46fc26d4616b6e323a3.png

如果一个数中小数点的位置是固定的,则为定点数;如果一个数中小数点的位置是浮动的,则为浮点数。一般来说,定点格式可表示的数值的范围有限,但要求的处理硬件比较简单。而浮点格式可表示的数值的范围很大,但要求的处理硬件比较复杂。

浮点数表示:

N=尾数*基数^指数

阶码的位数决定数的表示范围,位数越多范围越大

尾数的位数决定数的有效精度,位数越多精度越高

浮点数所能表示的数值范围主要由阶码决定,而表示的精度由尾数长度决定。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值