#P2112. 计算机理论知识.原码补码反码

计算机理论知识.原码补码反码

一、机器数和真值

  1. 机器数

机器数是一个数在计算机中的二进制表示形式。

机器数带符号,最高位为符号位,正数为 0,负数为 1 。

十进制数 +3,计算机字长为 8 位的话,转换二进制为 00000011

十进制数 -3,计算机字长为 8 位的话,转换二进制为 10000011

上述这两个二进制就是机器数。

  1. 真值

由于符号位的存在,机器数不等于真值。

带符号的机器数,真正的数值。

-3 是真值,它的机器数是 10000011(其形式值为 131(十进制))

二、数的原码、补码和反码表示

  1. 原码

原码是符号位加上真值的绝对值,即第一位为符号位,其余位表示值。

十进制数 +1 原码为 00000001

十进制数 -1 原码为 10000001

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

[11111111,01111111],即 [-127,127]

原码是人脑最容易理解和计算的编码方式。

无符号数用原码。

  1. 反码

正数的反码是其本身。

负数的反码是其原码基础上,符号位不变,其余各位取反。

[+1]{[+1]}_反 = [00000001]{[00000001]}_原 = [00000001]{[00000001]}_反

[1]{[-1]}_反 = [10000001]{[10000001]}_原 除符号位之外取反 = [11111110]{[11111110]}_反

反码不容易被人脑直接看出真值,通常需要转换成原码

  1. 补码

正数的补码是其本身。

负数的补码是其原码的基础上,符号位不变,其余各位取反最后 +1

[+1]{[+1]}_补 = [00000001]{[00000001]}_原 = [00000001]{[00000001]}_反 = [00000001]{[00000001]}_补

[1][-1]_补 = [10000001]{[10000001]}_原 取反 + 1 = [11111110]{[11111110]}_反 +1 = [11111111]{[11111111]}_补

补码不容易被人脑直接看出真值,通常需要转换成原码

数值在计算机中是以补码的方式存储的。之所以采用补码而不是原码,是因为在加减乘除运算过程中,补码的运算更加简单、快捷。反过来说,例如,加减法运算,如果基于原码进行运算,是比较复杂的,要分很多情况,5+3,5-3,-5-3,-5+3 .......很多种情况,处理的逻辑不太一样。但是,如果把数字以补码形式来存放之后,就可以基于补码直接运算,情况分类要少很多。因为,加减法运算都是在 CPU 里面基于集成电路实现的,越简单越有利于 CPU 的快速运算,所以,计算机都采用了补码的方式存放和运算数据。

下面举一个例子:计算 5-3,计算机为了简化计算的逻辑,会把减法运算转化成加法,所以,5-3 = 5+(-3)

5 的补码是 :00000101 -3 的补码是:11111101

上面两个补码连同符号位直接相加,得到 00000010 (最高位有溢出,不管),就是十进制的 2 。我们都知道 5-3 的确等于 2 。大家还可以自己构造更多的例子来加以验证。

三、数的顶点表示和浮点表示

在计算机中小数点一般有两种表示法:一种是小数点固定在某一位置的定点表示法;另外一种是小数点的位置可以任意移动的浮点表示法。相应于这两种表示的计算机分别称为顶点计算机和浮点计算机。

  1. 定点表示法(略略知道就可以了)

机器中所有数的小数点位置是固定不变的。因而小数点就不必使用记号表示出来。实际上,小数点可固定在任意一个位置上。

  1. 浮点表示法(这是考试重点)

在数的顶点表示法中,由于数的表示范围较狭窄常常不能满足各种数值问题的需要。为了扩大数的表示范围,方便用户试用,计算机常采用浮点表示法。表示一个浮点数,要用两部分:尾数阶码。尾数用以表示数的有效数值;阶码用于表示小数点在改数中的位置。

计算机多数情况下采用浮点数表示数值,它与科学计数法相似,把一个二进制数通过移动小数点位置表示成阶码和尾数两部分。

N=2E×SN=2^E \times S

其中 EENN 的阶码,是有符号的整数。SSNN 的尾数,是数值的有效数字部分,一般规定取二进制顶点纯小数形式。

例:

(1011101)2(1011101)_2 = 27×0.101110122^7 \times 0.1011101_2

(101.1101)2(101.1101)_2 = 23×0.101110122^3 \times 0.1011101_2

(0.01011101)2(0.01011101)_2 = 21×0.101110122^{-1} \times 0.1011101_2