弄懂任何问题均需搞清楚来龙去脉,这样大脑才更清晰,问题理解得更透彻!
1.计算机中处理的数据分为数值型数据和非数值型数据两大类
数值型数据是指能进行算术运算(加、减、乘、除四则运算)的数据,即通常所说的具有大小的“数”;非数值型数据是指文字、图像等不能进行算术运算的数据。这里我们重点讨论数值型数据(简称为数值)。数值在计算机内的表示,设计到数值的大小、符号、以及小数点的表示等问题。二进制数只有0和1两个基本符号,需要用这两个符号的不同组合来表示不同的数。
2.无符号数和有符号数(我们这里只讨论有符号数)
有符号数的"+"、"-"号机器无法识别,但是“正”、“负”恰好是两种截然不同的状态,如果用“0”表示“正”,用“1”表示“负”,这样符号也被数字化了。如
十进制 | 二进制真值 | 机器数 |
---|---|---|
+94 | +1011110 | 01011110 |
-49 | -0110001 | 10110001 |
把符号“数字化”的数称为机器数,而把带“+”或“-”符号的数称为真值。
接下来又有些问题需要考虑,在运算过程中,符号位能否和数值部分一起参加运算?如果参加运算,符号位又需作哪些处理?这些问题斗鱼符号位和数值位所构成的编码有关,这些编码就是原码、补码、反码和移码。
3.原码
原码表示简单明了,并易于和真值转换。但用原码进行加减运算时,却带来了许多麻烦。例如,当两个操作数符号不同且要作加法运算时,先要判断两数绝对值大小,然后将绝对值大的数减去绝对值小的数,结果的符号以绝对值大的数为准。运算步骤既复杂又费时,而且本来是加法运算却要用减法器实现。那么能否在计算机中只设加法器,只作加法操作呢?如果能找到一个与负数等价的正数来代替该负数,就可把减法操作用加法代替。而机器数采用补码时,就能满足此要求。
4.补码
计算机辨别”符号位”显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法,即采用补码。将补数的概念用到计算机中,便出现了补码这种机器数。引入补码的概念是为了消除减法运算,但是形成补码的过程中又出现了减法。如
x=-1011
[x]补= 2^(4+1)+ x = 100000 - 1011=1,0101
但是“由原码除符号位外,每位求反,末位加1,求补码”就可避免减法运算啦。
补码的出现还避免了原码中有“+0”、“-0”,虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的。而且会有[0000 0000]原和[1000 0000]原两个编码表示0。-0的补码与+0相同均为[0000 0000]补 所以补码能比原码和反码多表示一个负数即-128, 而-128并没有原码和反码表示。
5.反码
反码通常用来作为原码求补码或者补码求原码的中间过渡。
6.移码
7.补码为什么会比原码和反码多表示一个数?
首先看一个实例:
设机器数字长为8位(其中1位为符号位),对于整数,当其分别代表原码、补码和反码时,对应的真值范围各为多少?
二进制代码 | 原码对应的真值 | 补码对应的真值 | 反码对应的真值 | - |
---|---|---|---|---|
00000000 |
|
|
| - |
00000001 |
|
|
| - |
00000010 |
|
|
| - |
|
|
|
| - |
01111110 |
|
|
| - |
01111111 |
|
|
| - |
10000000 |
|
|
| - |
10000001 |
|
|
| - |
10000010 |
|
|
| - |
|
|
|
| - |
11111101 |
|
|
| - |
11111110 |
|
|
| - |
11111111 |
|
|
| - |