机器数、真值、符号位
机器数是将符号数字化的数,是数字在计算机中的二进制表示形式。机器数有2个特点:一是符号数字化,二是其数的大小受机器字长的限制。机器字长
二进制每个0和1是组成二进制的最小单位,称作位(bit),常用的位数有8、16、32、64位,字长为8位的组合编码称为字节,是计算机的基本编码单位。字长反应了一台计算机的计算精度,其他条件相同的情况下,字长越长,计算机处理速度越快。所以就有分成8位、16位、32位、64位CPU,对应相应位数的字长,越高位数的cpu可以同时处理相应位数的二进制数据,所以位数越高的CPU处理速度也就越快。
机器字长就同字长一样,机器字长是指计算机进行一次整数运算所能处理的二进制数据的位数,所以这个也反映了计算机的精度和速度。
由于计算机内部硬件只支持两种物理状态,一般是0和1,实用数据的+和-,我们用1表示-,0表示+,通常这个符号放在二进制数据的最高位,也称为符号位。例如一串二进制数表示为101001,机器数是带符号的,那么他的机器数就是101001,他的真值就是:第一位符号位转换1转换成-,后面的01001就是真值,转换为十进制就是-41。
原码
原码=(符号位+真值)的绝对值
例如这两串二进制10000001和00000001,原码就是[-1]和[+1],最高位是符号位,他们各自转换成十进制就是+1和-1。
反码
反码分成两种:正数的反码和负数的反码
正数的反码就是它本身;负数的反码就是符号位不变,将0和1反过来例如原码[-65],二进制11000001的反码就是[-62],二进制10111110
补码
和反码类似,正数的补码就是自身,负数的补码就是在进行反码操作后+1,例如原码[-33],二进制11000011的补码就是[-61],二进制10111101
移码
不论真负数,移码就是在原码的基础上将符号位取反。
阶码
在计算机中表示浮点数需要指数,而这个指数用整数形式表示,这个指数就用阶码表示,阶码表示的指数用来表示小数点在数据中的位置对于任意一个二进制数N,可用N=S×2**P表示,其中s是尾数,p是阶码,当阶码一定时,数的这种表示方法称为定点表示,这个数被称为定点数,而当阶码可变时,数的这种表示方法称为浮点表示,这个数也被称为浮点数。
作用
原码是直观明了的,容易让人理解,供人类理解计算,是早期计算机运用的
反码,相较于原码,做了个0、1置换,加减乘除是最基础的运算,因为减去一个数和加上这个数的负数得到的结果一样,所有计算机为了运算更方便设计更简单,就定义了+运算,同时使用符号位参与运算,这样使得计算更便捷,例如我们使用原码进行运算十进制的1-1=0
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
可以看到结果并不是0,所有就出现了反码来解决这个问题,同样是计算十进制1-1=0,看看反码
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
可以看到,虽然结果是0但是前面多了一个-,正常来说+0和-0的值都是0,也就是说0前面加正负号是没有意义的,同时会出现[10000000]原和[00000000]原两个编号的值都是0 的问题,为了解决这两个问题,补码出现了
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补= [0000 0000]补=[0000 0000]原=0
可以看到我们可以用[00000000]表示0,解决了两个问题,同时符号位也可以参与运算,使计算更加简便,所以补码使现代计算机标准的编码方式,这就是早期计算机编码方式一步步的优化。
最后是移码,移码核心作用是优化浮点数阶码的比较和运算,移码用于优化补码,补码表示的负数阶码(如 -128
)在比较时需额外处理符号位,效率较低。移码作为辅助补码运算的工具,通常依据补码进行设计,通常用于表示浮点数的阶码,因为如果阶码用不满表示的话,当阶码无限趋近于0时,整个数就会变成1,但实际上整个数是无限趋近于0的,所有这时候我们需要用到移码,对符号位取反是无限趋近于0的指数变成-0,也就是取了倒数来解决这个问题。
所以移码有几个优点,他是依据情况辅助补码进行编码,所以我们可以直观对浮点数的指数部分进行比较,无需考虑符号,使得计算效率更高,同时也避免了上面说的问题;但是同时也有缺点,刚才一直强调的,移码主要起辅助作用,根据补码来进行,所以它运用的场景是有局限性的,通常用于浮点数的指数部分和一些其他特定的情境,并不合适用在整数运算。