软考之路(4)—— 数据表示之原码、反码、补码

来源:互联网 发布:网络最火的游戏排行榜 编辑:程序博客网 时间:2024/05/21 07:09

在软考的必修科目中对于数据标识的认识少不了的,这部分的知识也是我们刚进入TGB时就需要学习的。下面我将这部分知识做个简单总结。


 ***************************************机器数&&真值**************************************


1、机器数

一个数在计算机中的二进制表示形式叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1。例如:

十进制

二进制

+3

00000011

-3

10000011

 

2、真值

带符号位的数值我们称为机器数的形式值,例如10000011。而机器数的形式值是不等于真正的数值的。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3而不是形式值13110000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

例:

0000 0001的真值 = +000 0001 = +1

1000 0001的真值 =000 0001 =1

 


***************************************计算&&方法***************************************


机器存储一个具体数字的编码方式称为:原码, 反码, 补码。

1.原码

原码:符号位+真值的绝对值,最高位表示符号,其余位表示值.比如(8位二进制):

[+1] = 0000 0001

[-1] = 1000 0001

2.反码

反码:正数的反码是其本身;负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

[+1] = [00000001] = [00000001]

[-1] = [10000001] = [11111110]

3.补码

补码:正数的补码就是其本身;负数的补码在其原码的基础上+1,符号位不变。

[+1] = [00000001] = [00000001] = [00000001]

[-1] = [10000001] = [11111110] = [11111111]

 


******************************************&&******************************************


我们知道计算机用三种编码方式表示一个正数,结果都是一样的,如下:

[+1] = [00000001] = [00000001] = [00000001]

但是对于用三种编码方式表示一个负数,结果却完全不一样,如下:

[-1] = [10000001] = [11111110] = [11111111]

原码是人脑能够直接识别并用于计算的表示方式,那么为何还会有反码和补码呢?

我们知道人脑是可以很容易的知道第一位是符号位的,因此在计算的时候我们会根据符号位,选择对真值区域的加减。但是对于计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂!。于是人们想出了将符号位也参与运算的方法。

1.反码的作用:

如果用原码表示,让符号位也参与计算,显然对于减法来说,结果是不正确的。这也就是为何计算机内部不使用原码表示一个数。为了解决原码做减法的问题,出现了反码:

1.原码计算十进制的表达式:1-1=0

1 - 1 = 1 + (-1) = [00000001] + [10000001] = [10000010] = -2(错误)

2.反码计算十进制的表达式:1-1=0

1 - 1 = 1 + (-1) = [00000001]+ [1111 1110] = [1111 1111] = [1000 0000] =-0(正确)

2.补码的作用:

细心的人会发现上面用反码计算减法的结果为-0,对于+0-0的理解,如果是人的话当然不会有什么错误,但是对于机器就不一样了。所以接下来我们要解决的的问题其实就是出现在"0"这个特殊的数值上.虽然人们理解上+0-0是一样的,但是0带符号是没有任何意义的。而且会有[0000 0000][1000 0000]两个编码表示0。为了解决0的符号的问题以及两个编码的问题,出现了补码:

1-1 = 1 + (-1) = [0000 0001] + [1111 1111] = [00000000]=[0000 0000]


******************************************&&******************************************


反码用来解决机器做减法的问题;补码为了解决0的符号的问题以及两个编码的问题。




0 0