zl程序教程

您现在的位置是:首页 >  工具

当前栏目

计算机组成原理学习日记一(原码,补码,反码,移码)

学习计算机原理 日记 组成 补码 原码 反码
2023-09-11 14:19:53 时间

真值

真值就是带有符号的数值,比如+10,-10


原码

原码就是使第一位为符号位,而其他位为数值位。原码将真值中无论是符号还是数值都以二进制的形式展示。

原码的移位

我们都知道在二进制中的位的权重值是以2的次方不断展开,如ip地址中

128 64 32 16 8 4 2 1,每一位都代表着 一个数值。

我们来看一个简单的二进制数0010,该二进制代表十进制+2(开头的一位代表符号),当我们只向右移动数值位,该二进制变为0001,二进制代表的数值由2变为了1。当我们将该二进制数向左移动的时候,该二进制变为0100,二进制代表的数值从2变为了4.

我们再看一个二进制数00110,该二进制代表十进制+6,当我们将该二进制数向右移动的时候,该二进制变为00011,二进制代表的数值从6变为了3.当我们将二进制数向左移动,该二进制变为01100,其对应的十进制变为12.

所以我们可以得到结论,当一个二进制原码不改变符号地向左移动时,其值增大一倍,向右则减少一倍。

那么到底为什么?

我们知道每个二进制的位都有一个权重值,比如二进制数00010,根据二进制的权重,其对应的十进制数值的计算公式为:4*1,当我们将其向左移动时其二进制数变为00100,1所处的位置所对应的权重增大了一倍,于是其值就为8。我们再看001100,其十进制数值计算公式为:(4*1+2*1)=6,当我们将其向左移动,其二进制变为01100,001100中1所处的两个位置的权重都发生了两倍的变化,于是,我们可以将变化后的二进制数的公式转变为 “2(4*1+2*1)=12”.

补码

补码主要的作用时用来计算减法,比起原码那种以第一位作为符号位的形式,试问你如果时计算机又该如何计算减法,明显较加法来说显得更加复杂。

比如一个正的二进制数减去一个负的二进制数,它就巧妙地转换为正二进制数加上负的二进制数地补码,由此来实现计算机的减法运算。为什么补码可以起到这样的作用呢?

假如一个二进制数是8位,那么它的最大的十进制数就是255,也就是11111111,当我们在255的基础上再加1的时候,它就会变为100000000,变为256,但是计算机只能存储8位数据,于是最高位就会被舍弃,于是数值又变为了0.于是就变成了每当数值到达256的时候,就从0重新开始累加。

那么现在看这样一个例子,假如一个8位的二进制数位32,当它想从32变为16,有几种选择。一种是32-16=16,而另一种则是通过32+255-16=16的方式,也就是凭借上述的性质变为16.很明显第一种是机器不擅长的减法,而另一种是机器擅长的加法。而255-16即239即-16的补码,因为它可以代替-16,使32变为16,与-16起到同样的效果。

所以书上关于负数的补码就会有【-x】补=模的大小-|x|。其实这个公式不用记住,记住下面这个:

正数啥都不变,负数符号位不变,数值位取反加1.

反码

关于反码记住转变方法即可:

正数啥都不变,负数符号位不变,数值位取反

移码

解决了减法不好算的问题,还有一个问题就是大小的比较,像原码那种使用第一位作为符号位然后其他作为数值位的做法,除了不好计算,还有一个缺点就是不好比较,如果将第一位的权重作为十进制数的一部分那么最终就会导致十进制数值的错乱,如果单单比较正负数的数值位,那么也毫无意义,总的来说为了更加直观的显示数值之间的大小,就搞了这个移码。

比如一个8位二进制数10111100,其第一位作为符号位,很明显它是一个负数,其值为-60。而该形式的二进制数(也就是8位二进制数)的范围为-127---+127。我们通过观察可以知道第一位的权重大小比其他位的权重和都大,比如该例,最高位权重位128,其他权重和为127。那么在该形式的二进制数的范围内,无论其数值为多少,只要我们加上最高位的权重,也就是128,其数值最终都会变为正数。于是负数在加上最高位权重后变为一个正数,正数再加上最高位权重后也变为正数,那么正数与正数之间就可以较为明显的比较大小了。

移码的转变方式:将一个原码转变位补码后,将其符号位取反即可