1、由来
原码、反码和补码的出现有以下几点原因:一个是由于计算机的硬件设计,计算机的运算只能以二进制的形式进行;再便是根据冯.洛伊曼的经典计算机框架体系,计算机由控制器、运算器、存储器、输入和输出五个部分组成,计算机的运算器只能做加法,但实际的运算过程中有减法的运算,而减法可以看成一个数的加上另一个数的负数,但这种方式需要一个符号位,即负号和正号。原码、反码和补码的出现就是为了解决计算机中存储数字符号位的问题以及让计算机能够计算有减法参与的加减法运算。
2、概念
符号位:一个数二进制位的最高位表示符号位,0表示正数,1表示负数(此处指有符号位的原码、反码和补码);
原码:一个数的二进制形式,再在它最高位加上一个符号位的二进制值,即是这个数的原码(符号位(0/1)+ 数值部分(该数的二进制值));
反码:01、若这个数是正整数,那么它的反码与原码相同;
02、若这个数是负整数,那么它的符号位为1,其余各位(数值位)按位取反=> 1->0 / 0->1;
补码:01、若这个数是正整数,那么它的反码与原码相同;
02、若这个数是负整数,那么它的符号位为1,其余各位(数值位)按位取反后,再在数值末尾+1;
概念小结:
正整数:补码 = 反码 = 原码;
负整数:反码 = 符号位为1,原码数值部分按位取反;
补码 = 符号位为1,原码数值部分按位取反,末尾再+1;
3、转换
因计算机中用二进制对数字进行存储以及运算,1bit为一个二进制位,8bit为1byte(一个字节,即一个英文字母或者半个汉字),此处便用8位二进制来举例说明原码、反码和补码之间的转换。
已知一个十进制整数:
正整数:
[+7]原 = 0 0000111(符号位为0);
[+7]反 = 0 0000111(数值部分等于原码);
[+7]补 = 0 0000111(数值部分等于原码);
负整数:
[-7]原 = 1 0000111(符号位为1);
[-7]反 = 1 1111000(符号位为1,数值部分按位取反);
[-7]补 = 1 1111001(符号位为1,数值部分先按位取反,末尾再+1);