什么是数制?用来表示数值的规则,如十进制,二进制.
机器数
用二进制的形式来表示数;最高位为符号位,1表示负数,0表示正数.
如: 1---->00000001;-1---->1000 0001
真值
从上面我们知道了机器数是计算机用来表示数的一种形式,但是用于最高位是符号位。这样就出现这样情况,1000 0001表示的真正数值为1,而不是129.这样我们把一个机器数表示的真正的实际的意义的值称之为真值。
原码、反码、补码
总体上来讲原码反码补码都是计算机本身用来存储数的一种方式。
原码
规则:符号位+真值的绝对值
如:[+1]原码=0000 0001;
[-1]原码=1000 0001;
反码
规则:正数反码为本身
负数反码为原码的取反,但符号位不变
如:[+1]原码=[+1]反码=0000 0001;
[-1]原码=1000 0001=[-1]反码=1111 1110;
补码
规则:正数补码为本身
负数补码为原码的反码的基础之上加1
如:[+1]原码=[+1]补码;
[-1]原码=1000 0001=[-1]反码=1111 1110=[-1]补码=1111 1111;
为何会出现三种表示方式?
通过上面三种我们得到正数1在各种情况下都是一致的:[+1]原反补码=0000 00001;
而反码不是一致的。
在计算机内部,为了将运算变得简单。将符号位也投入到运算之中来,这样不需要计算机去分析符号位的作用。但是我们发现
[+1]原码=0000 0001+[-1]原码=1000 0001=0000 00001=1;而不是0,这样一来就出现了错误。如何解决这个问题呢?
为了解决这个问题,反码出现了
[+1]原码+[-1]原码=1000 0001=[+1]反码=0000 0001+[-1]反码=1111 1110=0000 0000(反码)=0000 0000 (原码)=-0;
这样一来解决了原码之间运算的问题,但是问题又出现了-0=1000 0000(原码);+0=0000 0000 (原码);这样在计算机看来不一样。是没有意义的。
[+1]原码+[-1]原码=1000 0001=[+1]补码=0000 0001+[-1]补码=1111 1111=0000 0000(补码)=[0000 0000](原码)
这样用[0000 0000](原码)表示0就不会出现问题了。
总的来说,在整数中,原码和补码、反码都是一样的,对于负数反码在符号位不变的情况下各位取反所得;补码为反码基础上加1.而原码补码反码的出现都是为了满足在计算机在运算过程更加简单和便捷而出现的。