关于中央处理器的知识,计算机的运算方法。
计算机主要是以二进制来存储和运算,为什么是二?因为计算机主要是用硬件电路来实现的,硬件电路中电平的高和低就有了0和1两种状态。
如何用二进制来表示生活中的各种数据呢?
正数,二进制表示是比较简单的。
正数,主要有两种,一种是整数,还有一种是小数。
整数容易表示,比如25 用二进制表示就是 11001 每一个位考虑是多少,从低位到高位,在这里依次是1 2 4 8 16,按照0和1的赋值,作和运算。类比十进制,12035 考虑每个位上的重度,从低位到高位,依次是1 10 100 1000 10000,按照十个数的赋值,作和运算。
小数较难表示,先考虑纯小数。比如0.25 这里使用到一种乘以2与1比较并可能减1的方法。0.25*2=0.5<1 所以取0 ,0.5*2=1==1,所以取1 。所以0.25的二进制表示应为0.01.
为什么是这样?其实这和进制转换中的除K取余法相似。如果是整数的话,除K取余,直到阶梯形的下部为0(0的右边的余数取被除数),余数逆序排列。小数部分,乘K取整,直到小数部分为0。硬件电路上无从所知、
正数,无符号数,如何表示有符号数呢?正数是正的,负数是负的,0如何表示。
添加符号位,1表示负数,0表示正数。用来区分+ -
比如-3 用二进制表示就是1,11
而+4表示就是0,100
这种最直接的表示方法在机器中就叫做原码,机器码的一种形式。
正数和负数在原码的表示中如何作加减运算呢?
符号位不动,数值位比较绝对值大小,用大的减去小的,得到数值部分,符号位取绝对值大的。比如100-11=001 ,符号位是0 所以+4+(-3)在计算机中原码运算后得到的就是0,001
不方便,本来是加法却要用减法器实现,还要对绝对值大小进行比较。那么能否找到一个数,负数用一个等价的正数来表示呢,那么减法操作就可用加法代替。
补码,正数和原码的表示方法一样,负数把原码的数全部反转然后加1.
考虑时钟,12点为mod,+9是-3以12为模的补数。以12作为标准点,往逆时针拨3下,为-3,为9点。
如何求补数,用模加上负数。如何确定模,正数所能表示的最大数的2倍,*2,2^(n+1),多加一位。这里举一个书上的例子,比如-1101。 x的补数,模是多少,100000(总共6位,比1101多了2位,其实正数是5位,-其实也应该是一位,但是我们是要求的)-1101=1,0011(此为我们所求的负数)
整数补码和小数补码一样求。
特别注意到-1,如果机器数字长为8位,有1位为符号位。10000001,原码。11111111,补码。11111110,反码。
00000000,+0;10000000,-0。这是反应在原码中的有两个数表示同一个数。
00000000,+0;11111111,-0。这是反应在反码中的有两个数表示同一个数。
原码,00000000到01111111表示从+0到+127;10000000到11111111表示从-0到-127。
补码,00000000表示(+-)0,从00000001到01111111表示+1到+127;因为补码是要找一个与负数等价的正数来代替该负数,比如-128用正数的思维来看就是128(书上说一个负数可用它的正补数来代替,正补数和负数的绝对值之和即为模数。正补数可以用模加上负数本身求得。模是256 2的8次方 注意有9位),而128是10000000,这里一定要注意是真数的值,不要混淆成原码的正负表达,只是原码和补数有某种关系,但是原码还是机器中一种独立的机器数表示形式,所以-128的补码就是10000000。那么-127呢,用正数的思维来看是多少?129。129怎么表示,10000001,所谓128+1就是129了。依次类推。直到-2,对应的正数就是254,就是11111110。那么-1呢,对应的正数就是255,就是11111111。用一种模的思维,补数的思维来理解。
反码,反码是求补码的一种中间过渡。怎么求补码,先把真数转换成原码,再把原码转换成反码,最后把反码+1即可求得补码。符号位不动,数值位求反。真值+23,原码是0,10111 反码就是0,01000.补码呢,0,1001
所以同样的负数的二进制,在表示的值上反码统统比补码少1,因为由反码到补码要+1,反码就有这么神奇、、无论从补码的-1到0,还是原码的-127转换成-0,原码的-0转换成-127,补码就有这么点特殊,是从-128到-1的。呵呵。
这里有个题目,已知[y]补,求[-y]补。
如何求?
参考了书,1用二进制的思维来看,是2-n,可能更加准确点。
得出结论,由[y]补,求[-y]补 :将[y]补连同符号位在内每位取反,末位加1,即可得[-y]补
有个问题:当真值用补码表示时,由于符号位和数值部分一起编码,与习惯上的表示法不同,因此人们很难从补码的形式上直接判断其真值的大小,
用补码表示,比如010101 101011 ,显然前者比后者大,前者是21,后者是-21.
不过直观上很难判断,所以引进移码,
本来是有0在中间的,现在全部往右边移了2n个单元,直观上从0开始计数,计负数,容易判断。得名
0怎么表示呢,100000 ,前面是1,后面全是0,以示区分。从数值上分析,-32到-1到0再到+31 类似补码,负数要多一个、000000到0111111到100000再到111111。如此。
利用阶码的这一特点,当浮点数的阶码用移码表示时,就能很方便地判断阶码的大小。
如何更简便的求出移码呢?分析可得,将补码的符号位由‘0’改为‘1’,或由‘1’改为‘0’,即可得该真值的补码。
原文:http://www.cnblogs.com/tianxiajingse/p/3746553.html