计算机使用一定的编码方式进行存储,原码、反码、补码是机器存储一个具体数字的编码方式
1 原码
第一位表示符号 正数第一位为0,负数第一位为1,其余位表示值;以8位二进制表示
+1 原码 0000 0001
-1 原码 1000 0001
第一位为符号位(正负数符号位),所以8位二进制原码范围为
1111 1111 ,0111 1111 即 -127,127
原码是人容易理解的计算表示方式
2 反码
正数的反码就是其本身
负数的反码是在原数基础,符号位不变(第一位不变),其余各个位取反。
+1 原码 0000 0001 反码 0000 0001
-1 原码 1000 0001 反码 1111 1110
负数的反码是不可直观看出,最好转换成原码方式进行计算,就是上例子中
反码 1111 1110 转换成原码 1000 0001 ,就是-1了
3 补码
正数的补码就是其本身
负数的补码是在原数基础,符号位不变(第一位不变),其余各个位取反,再+1
其实负数的补码,是在负数的反码基础+1 即可
+1 原码 0000 0001 反码 0000 0001 补码 0000 0001
-1 原码 1000 0001 反码 1111 1110 补码 1111 1111
跟反码相同,不可以直观看出,负数的补码转换成原码进行计算,方便理解
补码1111 1111 先减一 1111 1110(现在反码形式了) ,第一位(符号位不变),
其余各位取反 1000 0001(原码形式了) -1
原码是最容易理解为什么还需要引入反码和补码呢?
计算机运算只保留加法方式,为了解决原码减法的问题,出现了反码
例如 1-1 = 1+(-1)= 原码 0000 0001 + 1000 0001 = 反码 0000 0001 + 1111 1110 = 反码 1111 1111
= 原码 1000 0000 = -0
但是在 +0 和 -0 其实表示为0 ,二进制位 0000 0000 ,1000 0000,为了解决0的
符号问题以及0的两个编码问题,出现了补码
1-1 = 1+(-1) = 原码 0000 0001 + 1000 0001 = 补码 0000 0001 + 1111 1111
= 补码 1 0000 0000(1没有在这个1字节里面) = 原码 0000 0000
这样0就用 0000 0000 表示了,就没有 -0的存在了
同时可以使用 1000 0000 表示-128
-1 + -127 = 原码 1000 0001 + 1111 1111 = 补码 1111 1111 + 1000 0001 = 补码 1000 000
=反码 1111 1111 = 原码 1000 0000
这个地方 反码 1000 0000 向反码转换可以 先原码-128 是 -128为正数 1000 0000
这个第一位为1 应该是符号位,溢出丢弃进位法则:在用有符号整形表示二进制数时,当后面的非符号位
发生溢出是,符号位不变,直接丢弃溢出为的进位
-128 原码 1000 0000 最高位1表示符号位,后面7位发生溢出,进位丢弃,符号位不变
反码 1111 1111 补码 1000 0000 反码末位加1,使后7位再次溢出,进位丢弃,符号位不变
综上所述,使用补码,修复了0的符号存在的-0和+0问题,还能够多表示一个最低数
即8位二进制,使用原码或反码表示范围 -127,+127;
使用补码表示范围 -128,127;机器使用补码存储在补码表示是多保存一个最小值