前言
原反补是为负数而设计的,所以可以理解为正数没有反码补码,就是用原码运算。只是为了和负数保持概念一致,所以正数的原码 = 反码 = 补码。
只考虑正数和负数的情况下,加法运算有三种(正数和正数,正数和负数,负数和负数),
用原码可以正确算出正数和正数,但是算正数和负数就会出错。
用反码可以正确算出正数和正数、正数和负数,但是算负数和负数就会出错。
用补码可以正确算出加法的三种情况。
原码、反码、补码
一、一些基础概念
1.机器数
由于计算机的硬件决定,任何存储于计算机中的数据,其本质都是以二进制码存储,在计算机用一个数的最高位存放符号, 正数为0, 负数为1(肯定有朋友不理解,在计算机里1不是为真吗,在这里负数为什么为1呢?因为不考虑负数之前的时候,转换为二进制一个数的最高位就是0,1属于是后来添加的),举例:十进制中的数(5),转换为机器数就是00000101,那么它的相反数即十进制中的数(-5),转换为机器数是10000101。
2.真值
因为带有符号位,所以机器数的形式值不等于其真值,以机器数1000 0011为例,其真正表示的值为-3,而形式值为131。将带符号的机器数的真正表示的值称为机器数的真值。
3.十进制转换二进制
用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
二、原码
原码表示法在数值前面增加了一位符号位(即最高位为符号位),原码不能直接参加运算,可能会出错,举个例子:十进制中1+(-1)=0,而在用原码运算的话0001+1001=1010,换算成十进制为-2,答案不一样这不显然错了吗。
问题就出现在了一个数加上它的相反数不等于0,那么就有了反码来解决这点。负数和正数互为相反数,所以干脆用一个正数按位取反来表示负数。
三、反码
反码就是一个数,它的原码除符号位外,按位取反。
举例-5的原码是10000101,反码是11111010,十进制中1+(-1)=0,现在用反码运算的话就是:
0001+1001->0001+1110=1111,反码1111转换为原码就是1000即0。但是当计算(-1)+(-1),又出现问题了,十进制中(-1)+(-1)=-2,用反码运算的话是:
1001+1001->1110+1110=1100,反码1100转换为原码就是1011即-3。
计算(-2)+(-3),十进制是-5,用反码运算的话是:
1010+1011->1101+1100=1001,反码1001转换为原码就是1110即-6。
经过多次运算我们可以发现了一个规律:用反码对两个负数进行运算真实值和所得值相差为1。反码并不能完全的解决问题,因此就有了补码。
四、补码
负数的补码等于反码+1
举例-5的原码是10000101,反码是11111010,补码是11111011。
现在用补码计算(-2)+(-3):
1010+1011->1101+1100->1110+1101=1011,补码1011的反码是1010,反码1010的原码是1101即-5,到此问题完美解决。
练习题
用补码运算计算9-12
注:(计算时注意正数的补码就是原码)
1.转换为加法
9+(-12)
2.转化为原码
00001001+10001100
3.转换为反码
00001001+11110011
4.转换为补码
00001001+11110100
5.计算
11111101
6.转换为反码
11111100
7.转换为原码
10000011
8.转换为十进制
-3
总结
原码、反码、补码的引入是为了解决做减法的问题。在原码、反码表示法中,我们把减法化为加法的思维是减去一个数等于加上这个数的相反数,结果发现引入符号位,却因为符号位造成了各种意想不到的问题,而补码就是来解决这个问题的。