对于原码、反码、补码的深入理解@TOC
写在前面的话
从开始学C语言开始,就比较害怕原码反码补码,当时没学好,导致现在遇到还是比较害怕,为了战胜它,这次准备一口气弄懂原码反码补码的区别,让自己以后不害怕!!!
原码反码补码的前身–机器数和真值
机器数:一个数在计算机中的二进制表现形式叫做这个数的机器数。机器数有正有负,最高位为0代表正数,最高位为1代表负数。
例如:+3,在8位计算机中表示为:0000 0011;
-3,在8位计算机中表示为:1000 0011。
真值:真值代表机器数(在计算机中以二进制的形式表示)实际表示的十进制数。
例如:0000 0011→+000 0011→+3;
1000 0011→-000 0011→-3。
原码反码补码
理解了上面的机器数和真值的概念后,我们来开始原码反码补码!!!
-
原码(机器数)
正数:原码=机器数
例如:+3 →0000 0011(原码)→0000 0011(机器数)
负数:原码=机器数
例如:-3→1000 0011(原码)→1000 0011(机器数) -
反码
正数:正数的反码=正数的原码
例如:+11→0000 1011(原码)→0000 1011(反码)
负数:负数的反码=负数的原码中,符号位不动,其余位数取反(0变1,1变0)
例如:-11→1000 1011(原码)→1111 0100(反码) -
补码
正数:正数的补码=正数的反码=正数的原码
例如:+15→0000 1111(原码)→0000 1111(反码)→0000 1111(补码)
负数:负数的补码=负数的原码取反+1=负数的反码+1
例如:-15→1000 1111(原码)→1111 0000(反码)→1111 0001(补码)
关于8位数取值范围[-128,127]问题
-
对于8进制数的原码取值范围
8进制的原码取值范围是[-127,127]。对于原码来说1000 0000是没有意义的 -
对于8进制数的反码取值范围
为了解决原码中的减法问题,提出了反码,让A-B变成A+(-B)的形式,其中(-B)为B的反码,为此提出反码。
8进制的反码取值范围是[-127,127]。只是反码中有两个二进制码都表示0,分别为0000 0000=+0,1000 0000=-0 -
8进制补码解决反码中0有两种编码问题
为了解决反码中出现的0有两种编码的情况,即0000 0000和1000 0000都代表0的情况,补码出现了,补码通过对反码加一,新增了一个最小数,将1000 0000(0的另外一种表达方式)作为最小数,解决了反码中0有两种编码方式的问题。扩大了补码的取值范围为:[-128,128]
负数的原码和补码的关系
负数的补码代表的真值= -128-(负数);
例如:求-15的补码
(-15)的补码真值 = -128-(-15)=-113;