一、机器数和真值
1、 机器数
一个数在计算机中的二进制表示,叫做这个数的机器数。机器数是带符号的,在计算机 中,用一个数的最高位存放符号,正数为 0,负数为 1。
例如十进制中的 7,计算机字长为 8 位(以下均采用字长为 8 位的)
7的机器数为: 0 0 0 0 0 1 1 1
−7的机器数为: 1 0 0 0 0 1 1 1
2、真值
机器数的第一位是符号位,后边才是真正的数值。为区别起见,将带符号位的机器数对 应的真正数值称为机器数的真值。
例:0 0 0 0 0 1 1 1 的真值 = +0 0 0 0 0 1 1 1 = 7
1 0 0 0 0 0 1 1 的真值 = −0 0 0 0 0 0 1 1 = −3
二、原码、反码、补码
1.原码
原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
假设我们用8位表示数字
15=00001111
-15=10001111
2.反码
反码:正数的反码还是等于原码
负数的反码就是他的原码除符号位外,按位取反.
例如:
15 = 00001111(原码)
00001111(反码)
-15= 10001111 (原码)
11110000 (反码)
3.补码
补码:正数的补码等于它的原码
负数的补码等于反码+1。
例如:
15 = 00001111 (原码)
00001111 (反码)
00001111 (补码)
-15 = 10001111 (原码)
11110000 (反码)
11110001 (补码)
三、为什么用原码反码补码
计算机中的运算器只有加法运算器,做减法时需要转换成加一个负数的形式。
例如计算1−1的时候,就要变成 1+(−1) = 0。
我们用原码进行计算如下:
+1 的原码 = 0 0 0 0 0 0 0 1,
−1 的原码 = 1 0 0 0 0 0 0 1。
0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 1 = 1 0 0 0 0 0 1 0 = −2
请你思考:为什么会出现这样的结果? 因为引入了符号位。两个正数相加时,符号位都是 0,其余各位相加,得出的结果是正 确的;一旦有负数参与运算,就会得出错误的结果。 怎么解决这个问题呢?首先考虑:一个负数就是一个正数的相反数,且它们的和为 0。
例如:−1 + 1 = 0。那么,我们尝试用一个正数按位取反来表示一个负数,是否能准确计算 正负数相加呢? 所以我们有了关于反码的思考。
我们用反码进行计算如下:
+1 = 0 0 0 0 0 0 0 1(原) = 0 0 0 0 0 0 0 1(反)
−1 = 1 0 0 0 0 0 0 1(原) = 1 1 1 1 1 1 1 0 (反)
尝试计算−1 + 1: 0 0 0 0 0 0 0 1 + 1 1 1 1 1 1 1 0 = 1 1 1 1 1 1 1 1
注意,这里是用反码计算,所以结果需要进行“符号位不变,其余各位取反”的操作, 即转换成原码为 1 0 0 0 0 0 0 0 = −0 = 0。计算结果是正确的。 解决了正数与负数相加的问题。
现在尝试计算两个负数相加 −1 − 1: 1 1 1 1 1 1 1 0 + 1 1 1 1 1 1 1 0 = 1 1 1 1 1 1 0 0 将结果转换为原码:1 0 0 0 0 1 1 (原) = −3,但−1 − 1 = −2,计算结果错误,因此引入了补码,以此解决负数相加的问题。
我们用补码进行计算如下:
−1 = 1 0 0 0 0 0 0 1(原) = 1 1 1 1 1 1 1 0 (反) = 1 1 1 1 1 1 1 1(补)
用补码计算−1 + (− 1): 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 = 1 1 1 1 1 1 1 0
将结果转换为原码(先−1,再符号位不变,其余各位取反): 1 0 0 0 0 0 1 0(原) =−2。 补码的表示方式可以计算正数相加、正负数相加、负数相加的所有情况,因此,数值在计算机中以补码的方式存储。