一,原码
原码表示法规定:用符号位和数值表示带符号数,正数的符号位用 “0” 表示,负数的符号位用 “1” 表示,数值部分用二进制形式表示。
如:
在八位编码下,原码 取值从 -2^7+1~+2^7-1
x[原]=01111111 x= 2^7-1
x[原]=00000000 x=+0
x[原]=10000000 x=-0
x[原]=11111111 x=-2^7+1
原码的缺陷:1,因为有着正0 和 负0,所以 原码只能表示 2^8-1 个数。
2,正负原码无法直接相加,在计算机内部计算麻烦。因为要把符号位和数值位分开计算。
如 2+(-1)= 1,但 00000010 +10000001=10000011 其真值为 -3
因为原码有着这样的缺陷,所以在计算机内部,更常用的数值表示方法是补码。
二,补码
补码表示法规定:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后再加一
如:
在八位编码下,补码 取值从 -2^7~+2^7-1
设真值 x=1, y=--2,a=0
则 [x]原=0000 0001 [x]补=0000 0001
[y]原=1000 0010 [y]补=1111 1110
[a]原=0000 0000 [a]补=0000 0000
另外:
由于计算机的定长 进位的话就被截掉了
就是 b=-0 [b]原=1000 0000 本来 [b]补= 1 0000 0000
但 1 被截断 于是 [b]补=0000 0000 这样 +0 和 -0 就统一了
于是 [n]补= 1000 0000 就空出来了 // n表示未知量
于是认为规定 [-128]补= 1000 0000
在计算机中 正数表示形式 都是一样的 但 负数 却有三种表示方法:原码,反码,补码
三码之间的比较:
其中 原码表示形式简单,适于乘除运算 (这个不太理解),
但其加减运算就比较复杂了,因为要区分正负号 与数值部分,较为麻烦
于是为了解决这个问题,引入了 反码和补码 ,
反码和补码 其减法可以用加法实现 ,且 数的符号位可以和数值一样参与运算
至于说反码和补码有什么区别的话,我个人认为 补码是反码的优化版
其实 反码和补码 就差在那个 末位加一上,
这一加 1,不仅统一了反码 +0和-0的问题,
还扩大的反码数值表示范围 (其实也就多加了一个数)