还剩5页未读,继续阅读
文本内容:
十进制与二进制的转换
1.十进制整数转换为二进制整数十进制整数转换为二进制整数采用”除2取余逆序排列”法具体做法是:用2去除十进制整数可以得到商和余数;再用2去除商又会得到商和余数;如此进行直到商为零时为止,然后把先得到余数作为2进制数低位有效位后得到余数作为2进制数高位有效位依次排列起来
2.十进制小数转换为二进制小数十进制小数转换成二进制小数采用乘2取整顺序排列”法具体做法是:用2乘十进制小数可以得到积将积整数部分取出再用2乘余下小数部分又得到个积再将积整数部分取出如此进行直到积中小数部分为零或者达到所要求精度为止;然后把取出整数部分按顺序排列起来先取整数作为2进制小数高位有效位后取整数作为低位有效位;
0.62510=
0.1012;二进制转十进制思路方法按权展开求和;
1011.01=2w;123+022+121+12°+02-I+12X X X XXX2=8+0+2+l+0+
0.25;10=
11.25;10机器数和真值在学习原码,反码和补码之前,需要先了解机器数和真值的概念.
1.机器数一个数在计算机中的二进制表示形式,叫做这个数的机器数机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为
1.比如,十进制中的数+3,计算机字长为8位,转换成二进制就是00000011如果是-3,就是10000011o那么,这里的00000011和10000011就是机器数
2.真值因为第一位是符号位,所以机器数的形式值就不等于真正的数值例如上面的有符号数looooon,其最高位1代表负,其真正数值是-3而不是形式值131(10000011转换成十进制等于131)所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值例00000001的真值=+0000001=+1,10000001的真值=-0000001=-1原码、反码、补码的基础概念和计算方法_在探求为何机器要使用补码之前,让我们先了解原码,反码和补码的概念.对于一个数,计算机要使用一定的编码方式进行存储.原码,反码,补码是机器存储一个具体数字的编码方式.
1.原码原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值.比如如果是8位二进制[+1]原=00000001第一位是符号位.因为第一位是符号位,所以8位二进制数的取值范围就是[11111111,01111111]即[—127,127]原码是人脑最容易理解和计算的表示方式.
2.反码反码的表示方法是正数的反码是其本身负数的反码是在其原码的基础上,符号位不变,其余各个位取反.[+1]=
[00000001]原二
[00000001]反[-U=[looooooi]原二[nniiio]反可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值.通常要将其转换成原码再计算.
3.补码补码的表不方法是正数的补码就是其本身负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+
1.(即在反码的基础上+1)[+1]=
[00000001]原=
[00000001]反二
[00000001]补[-1]=[looooooi]原=[nunio]反=[inuui]补对于负数,补码表示方式也是人脑无法直观看出其数值的.通常也需要转换成原码在计算其数值.为何要使用原码,反码和补码在开始深入学习前,我的学习建议是先”死记硬背〃上面的原码,反码和补码的表示方式以及计算方法.现在我们知道了计算机可以有三种编码方式表示一个数.对于正数因为三种编码方式的结果都相同[+1]=
[00000001]原=
[00000001]反二
[00000001]补所以不需要过多解释.但是对于负数[-1]=[looooooi]原=[ninno]反=[iinini]补可见原码,反码和补码是完全不同的.既然原码才是被人脑直接识别并用于计算表示方式,为何还会有反码和补码呢?首先,因为人脑可以知道第一位是符号位,在计算的时候我们会根据符号位,选择对真值区域的加减.真值的概念在本文最开头.但是对于计算机,加减乘数已经是最基础的运算,要设计的尽量简单.计算机辨别符号位”显然会让计算机的基础电路设计变得十分复杂!于是人们想出了将符号位也参与运算的方法.我们知道,根据运算法则减去一个正数等于加上一个负数,KP1-1=1+-1=0,所以机器可以只有加法而没有减法,这样计算机运算的设计就更简单了.于是人们开始探索将符号位参与运算,并且只保留加法的方法.首先来看原码计算十进制的表达式1-1二01-1=1+-1=
[00000001]原+
[10000001]原二
[10000010]原=-2如果用原码表示,让符号位也参与计算,显然对于减法来说,结果是不正确的.这也就是为何计算机内部不使用原码表示一个数.为了解决原码做减法的问题,出现了反码计算十进制的表达式1T=01-1=1+-1=[00000001]原+[10000001]原二[0000oooi]反+[mi ino]反二[mi nn]反二[woo oooo]原二-o发现用反码计算减法,结果的真值部分是正确的.而唯一的问题其实就出现在“0”这个特殊的数值上.虽然人们理解上+0和-0是一样的,但是0带符号是没有任何意义的.而且会有
[00000000]原和
[10000000]原两个编码表示
0.于是补码的出现,解决了0的符号以及两个编码的问题1-1=1+-1=
[00000001]原+
[10000001]原=
[00000001]#+
[11111111]补=
[00000000]#=
[00000000]原这样0用
[00000000]表示,而以前出现问题的-0则不存在了.而且可以用
[10000000]表示-128-1+-127=
[10000001]原+[1111nil]原=
[11111111]#+
[10000001]#=
[10000000]#-1-127的结果应该是-128,在用补码运算的结果中,
[10000000]补就是-
128.但是注意因为实际上是使用以前的-0的补码来表不一128,所以T28并没有原码和反码表示.天一-128的补码表示
[10000000]补算出来的原码是
[00000000]原,这是不正确的使用补码,不仅仅修复了0的符号以及存在两个编码的问题,而且还能够多表示一个最低数.这就是为什么8位二进制,使用原码或反码表示的范围为[-127,+127],而使用补码表示的范围为[T28,127].因为机器使用补码,所以对于编程中常用到的32位int类型,可以表示范围是[-231,231-1]因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.。