一、概念简述
机器码:一个数在计算机中的二进制形式,机器码是带符号的,在计算机用机器码的最高位存放符号,正数为0,负数为1。
如 0000 0011 和 1000 0011。
机器码的真值:机器码除符号位剩下的真正数值。
如 0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1。
原码:数值的二进制表示形式,用来转换对应的进制。
如: [+1]原= 0000 0001
[-1]原= 1000 0001
反码:符号位不变,进制码0变1,1变0叫做反码,反码用于原码补码之间的转换。
如: [+1] = [0000 0001]原= [0000 0001]反,
[-1] = [1000 0001]原= [1111 1110]反
补码:反码加1,用来做数据的存储运算。
如: [+1] = [0000 0001]原= [0000 0001]反= [0000 0001]补
[-1] = [1000 0001]原= [1111 1110]反= [1111 1111]补
二、运算规则
(原码 反码 补码之间的转换 , 符号位不要动)
正数: 原码 = 反码 = 补码
负数: 原码 = 补码取反加1 给补码求原码
负数: 补码 = 原码取反加1 给原码求补码
可以看出,反码用于原码与补码之间的转换。
三、作用
由上可见原码,反码和补码是完全不同的。既然原码才是被人脑直接识别并用于计算表示方式,为何还会有反码和补码呢?
首先, 因为人脑可以知道第一位是符号位,在计算的时候我们会根据符号位,选择对真值区域的加减。但是对于计算机,加减乘除已经是最基础的运算,要设计的尽量简单,计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂!
于是人们想出了将符号位也参与运算的方法。我们知道,根据运算法则减去一个正数等于加上一个负数,即:1-1 = 1 + (-1) = 0, 所以机器可以只有加法而没有减法,这样计算机运算的设计就更简单了。
于是人们开始探索将符号位参与运算,并且只保留加法的方法。
四、运算例子
求10 +(- 12) = ?
补码用来做数据的存储运算,因此先求10和-12的补码
10的补码(=反码=原码):0000 1010(高位为0,表示正数)
-12的原码: 1000 1100 (高位为1,表示负数,转换为10进制时,高位的1不用进行换算)
反码: 1111 0011 (原码取反)
补码: 1111 0100 (反码加1)
补码做相加运算
10的补码: 0000 1010
-12的补码: 1111 0100
-------------
结果(补码): 1111 1110
补码再转换为原码(即补码的补码,同样做取反加1换算)
补码: 1111 1110(高位为1,表示负数,进行补码反码原码换算时是不变的)
反码: 1000 0001(补码取反)
原码: 1000 0010(反码加1)
10进制: -2
参考:https://zhuanlan.zhihu.com/p/91967268?utm_source=wechat_session