原码反码和补码
有符号数最高位为符号位,0为正数,1为负数。
正数的原码、反码和补码都是正数的二进制
e.g. 6(10)=00000110(2) 原码:00000110 反码:00000110 补码:00000110
负数的原码为它绝对值的二进制,但最高位为1,反码为原码取反(除了符号位,0变1,1变0),补码为反码+1.
e.g. 6(10)=00000110(2), -6(10)的原码为10000110,反码为11111001,补码为11111010.
正数存储原码,负数存储补码。
负数原码、反码、补码的互化:
原码除了符号位,其他为取反为反码,反码+1为补码。
原码直接转补码: 从右开始数,遇到第一个1以后,1左边的各位(除了符号位)取反。
e.g. -6(10)的原码为10000110,从右边数起,第一个是0,跳过,第二位是1,从下一位起
开始取反。6的补码:11111010;
补码转原码:补码取反(除符号位)后+1,或者按照原码直接转补码的方法转换(符号位不变),即补码的补码为原码。
e.g. (1) -6的补码:11111010,取反:10000101 再+1得原码:10000110
(2)11111010->10000110
整数的运算(加减法)补码相加。
加法:
5+(-6) :00000101+11111010=11111111,11111111最高位为1,负数,所以先把它转化为原码:10000001,即-1(10)
-6+6:11111010+00000110=10000000,出现了9位,但只存储8位,最高位被舍弃,即为0.如果不用补码而用反码运算,就会出现+0和-0的问题。
2.减法:转化为加法操作。