在软考的必修科目中对于数据标识的认识少不了的,这部分的知识也是我们刚进入TGB时就需要学习的。下面我将这部分知识做个简单总结。
***************************************机器数&&真值**************************************
1、机器数
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1。例如:
十进制 |
二进制 |
+3 |
00000011 |
-3 |
10000011 |
2、真值
带符号位的数值我们称为机器数的形式值,例如10000011。而机器数的形式值是不等于真正的数值的。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于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的符号的问题以及两个编码的问题。