机器数和符号位
在学习原码,反码和补码之前 我们先来了解什么叫机器数和真值
- 机器数: 一个数在计算机中的二进制表示形式,叫做这个数的机器数
- 机器数是带符号的 在计算机中用一个数的最高位存放符号 正数为0 负数为1
比如 十进制中的数 +5 如果计算机字长为8位 转换成二进制的话就是 0000_0101
如果是 -5 就是1000_00101(原码)
真值
因为第一位是符号位 所以机器数的形式值不等于真正的数值 例如上面的有符号数 1000_0101 其最高位1代表负 其真正的数值是 - 5 而不是形式值 133 (10000101转换成十进制是133) 所以 为区别起见 将带符号位的机器数对应的真正数值称为机器数的真值
原码
原码就是符号位加上真值的绝对值 即用第一位表示符号 其余位表示值 比如如果是8位二进制:
[+1]原 = 0000_0001
[-1]原 = 1000_0001
因为第一位是符号位 所以8位二进制的取值范围是
[1111_1111,0111_1111] 即[-127,127]
这个地方要注意一下 不是[-128,127]或者[-128,128]
原码是人脑最容易理解和计算的表示方式
反码
反码就是 : 正数的反码是其本身 负数的反码是在其原码的基础上 【符号位不变】其余各个位【取反】
[+1] = [0000_0001]原 = [0000_0001]反
[-1] = [1000_0001]原 = [1111_1110]反
可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值,通常要将其转换成原码再计算。
补码
补码就是 : 正数的补码就是其本身。负数的补码是在其原码的基础上,【符号位不变】,其余各位取反,最后+1,即【取反+1】
[+1] = [0000_0001]原 = [0000_0001]反 = [0000_0001]补
[-1] = [1000_0001]原 = [1111_1110]反 = [1111_1111]补
对于负数,补码表示方式也是人脑无法直观看出其数值的,通常也需要转换成原码再计算其数值。
移码
移码最简单了,不管正负数,只要将其补码的符号位取反即可。
[+1] = [0000_0001]原 = [0000_0001]反 = [0000_0001]补 = [1000_0001]移
[-1] = [1000_0001]原 = [1111_1110]反 = [1111_1111]补 = [0111_1111]移
对于一个数 计算机要使用一定的编码方式进行存储 原码反码补码是机器存储一个具体数字的编码方式