您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 数值型数据的表示及处理
原码、反码、补码数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚.为了能方便的与二进制转换,就使用了十六进制和八进制.下面进入正题.数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1byte,原码能表示数值的范围为(-127~-0+0~127)共256个.有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下:假设字长为8bits,(1)10-(1)10=(1)10+(-1)10=(00000001)原+(10000001)原=(10000010)原=(-2)显然不正确(十进制的1减1当然为0)。因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上,对除符号位外的其余各位逐位取反就产生了反码.反码的取值空间和原码相同且一一对应.下面是反码的减法运算:(1)10-(1)10=(1)10+(-1)10=(00000001)反+(11111110)反=(11111111)反=(-0)有问题.(1)10-(2)10=(1)10+(-2)10=(00000001)反+(11111101)反=(11111110)反=(-1)正确。问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大).于是就引入了补码概念.负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:(-128~0~127)共256个.注意-128没有相对应的原码和反码,(-128)=(10000000)补码的加减运算如下:(1)10-(1)10=(1)10+(-1)10=(00000001)补+(11111111)补=(00000000)补=(0)正确(1)10-(2)10=(1)10+(-2)10=(00000001)补+(11111110)补=(11111111)补=(-1)正确所以补码的设计目的是:⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。数值型数据的表示及处理计算机内部的数值型数据都是采用二进制形式来表示的。人们日常已习惯使用十进制,书写起来很方便,而用二进制书写起来位数长得多,读起来也不一目了然。但用二进制易于用物理器件实现,运算起来规则简单,所以任何数值型数据在计算机内都是用二进制表示的。计算机中的数值型数据分成整数和实数两种,下面分别介绍它们的二进制表示方法。2.1.4.1整数(定点数)表示定点数的含义是约定小数点在某一固定位置上,整数可用定点数表示,约定小数点的位置在数值的最右边。整数分两类:无符号整数和有符号整数。(1)无符号整数无符号整数常用于表示地址等正整数,可以是8位、16位、32位或更多位数。8位的正整数的表示范围是0~255(28一1),16位的正整数的表示范围是0~65535(216一1),32位的正整数的表示范围是0~232一1。(2)有符号整数有符号整数使用一个二进制位作为符号位,一般符号位都放在所有数位的最左面一位(最高位),“0”代表正号“+”(正数),“1”代表负号“一”(负数),其余各位用来表示数值的大小。可以采用不同的方法表示有符号整数,一般有原码、反码和补码。为简化起见,以下假设只用一个字节来表示一个整数。带符号数表示法与运算带符号数的表示主要有真值、原码、反码、补码4种表示形式。(1)真值:是某个带符号数的真实值,通常是用十进制表示,+/–号表示符号。(2)原码:将真值前面的正(负)号用代码0(1)表示且放在数值位前面,并且数值部分用二进制表示。(3)反码:将原码的符号位不变,数值位按位取反。(4)补码:在反码的末位加1。在现代计算机中,算术运算都是以补码为基础,操作数是补码的形式表示,运算结果也是以补码形式表示或存储。①原码表示数值型数据的原码表示是将最高位作符号位,其余各位用数值本身的绝对值(二进制形式)表示。假设用[X]原表示X的原码,则[+1]原=00000001[+127]原=01111111[-1]原=10000001[-127]原=11111111对于0的原码表示,+0和一0的表示形式不同,也就是说,0的原码表示不惟一。[+0]原=00000000[-0]原=10000000由此可以看出,8位原码表示的最大值是127,最小值是一127,表示数的范围为一127~127。例如:01011101符号位表示二进制数+1011101,即十进制数93;11011101符号位表示二进制数一1011101,即十进制数一93。②反码表示数值型数据的反码表示规则是:如果一个数值为正,则它的反码与原码相同;如果一个数值为负,则符号位为1,其余各位是对数值位取反。假设用[X]反表示X的反码,则[+1]反=00000001[+127]反=01111111[-1]反=11111110[-127]反=1000000对于0的反码表示,+0和一0的表示形式同样不同,也就是说,0的反码表示不惟一。[+0]反=00000000[-0]反=11111111用8位反码表示的最大值为127,其反码为01111111;最小值为一127,其反码为10000000。用反码表示数值型数据,现已不多用。③补码表示原码和反码都不便于计算机内的运算,因为在运算中要单独处理其符号。例如,对以原码表示的+7和一9相加,必须先判断各自的符号位,然后对后7位进行相应的处理,很不方便。因此,最好能做到将符号位和其他位统一处理,对减法也按加法来处理,这就是“补码”。补码的原理可以用时钟来说明。例如,要将时针从9点拨到4点,可以向前拨,也可以向后拨,其表示如下:9—5=4(向后拨5个字)9+7=16(向前拨7个字)可见,向后拨5个字能指向4,向前拨7个字也能指向4。时钟是十二进制的,可以把12点看成0点,12点的下一个时针指向是1点,13点就是1点,其实是进位后得到了十二进制数11,其中第一个1是进位,即高位,第二个1是低位。高位不保留,只保留低位,因此16点用十二进制数表示为4,高位不保留,在时钟上就是4点,用十进制数可表示为:16—12=4。上例中,用减法和加法都能得到4,其中12被称为模,5和7被称为模12下互补,即5的补数是7,7的补数是5。这个例子可以推广到其他进制,如十进制、二进制等。在计算机中,以一个有限长度的二进制作为数的模,如果用1个字节表示1个数,1个字节为8位,因为逢28就进1,所以模为28。对于补码是这样规定的:正数的原码、反码、补码都是相同的;负数的最高位为1,其余各位为数值位的绝对值取反,然后对整个数加1。假设用[X]补表示X补码,则[+1]补=00000001[+127]补=01111111[-1]补=11111111[-127]补=1000001在补码表示中,0的补码表示是惟一的。[+0]补=[-0]补=00000000因此在补码表示中,多出来一个编码10000000,把10000000的最高位1既看做符号位,又作为数值位,其值为一128,这样补码表示的数值范围可扩展一个,负数最小值为一128,而不是一127。用8位补码表示的数值数据其最大值为127,最小值为一128,表示数的范围为一128~127。计算机一般是以补码形式存放数值数据的。例如:求一5l的补码。一51为负数,所以符号位为1,绝对值部分是原码的每一位取反后再在末位加1。[-51]原=10110011其绝对值部分的每一位取反后,得11001100再在取反后的数值末位加1,得11001101即[-51]补=11001101用补码进行运算,减法可以用加法来实现。例如+7—6应得1,可以将+7的补码和一6的补码相加,就得到结果值的补码。+7的补码:00000111-6的补码:+11111010100000001进位进位被舍去,进位右边的8位00000001就是l的补码。(3)各种整数表示法的比较和表示范围各种编码方法的表数范围:有符号数n+1位二进制编码x表示的整数范围:原码、反码:-2n<x<2n补码:-2n≤x<2n无符号数n位二进制编码X表示的整数范围:0≤X<2n-1假设用8位二进制代码表示无符号整数和有符号整数,则8位二进制代码所能表示的256个不同的值在各种整数表示法中表示的数值见表2—5。表2-5三种整数的比较8位二进制代码无符号整数原码补码00000000000000000011110000001022200000011333……………………011111101261261260111111112712712710000000128—0—12810000001129—1—12710000010130—2—12610000011131—3—125……………………11111110254—126—211111111255—127—1整数表示的数其范围是有限的,根据计算机的字长,整数可以用8位、16位、32位等表示。当整数分别用无符号整数、原码、反码、补码表示时,表示数的范围见表2—6。表2-6不同位数和不同表示法下数的表示范围二进制位数无符号数的表示范围补码的表示范围原码、反码的表示范围80~(28-1)-27~(27-1)-27~(27-1)160~(216-1)-215~(215-1)-(215-1)~215-1320~(232-1)-231~(231-1)-(231-1)~231-1各种编码之间的相互转换:[x]原[x]补:x≥0,[x]补=[x]原;x<0,符号位不变,数值位取反+1。例1:[X1]原=01111111=7FH,[X1]补=01111111=7FH[X2]原=11111111=FFH,[X2]补=10000001=81H例2:[X1]原=59H,[X2]原=D9H,求真值?X1=+1011001B=+89X2=-1011001B=-89例3:[X1]补=59H,[X2]补=D9H,求真值?X1=+1011001B=+89X2=-0100111B=-39(4)BCD码当在计算机内表示十进制整数时,除了前面介绍的先转换成二进制数,再选用原码、反码或补码表示外,还有一种表示方法也经常使用,这种编码方法称为“二进制编码的十进制整数(BinaryCodedDecimal,简称BCD码),它把1位十进制数用4位二进制编码表示,符号位仍然是正数为“0”,负数为“1”。这种编码方法可形成多种形式的编码,最常用的是8421BCD码。在8421BCD码中4个二进制位自左至右每位的权分别是23,22,21,20,即8,4,2,1,所以称为8421BCD码,也简称为8421码。表2—7列出BCD码与十进制数、二进制数的比较。表2-7BCD码与是十进制数、二进制数的比较十进制数二进制数8421BCD码000000000100010001200100010300110011401000100501010101601100110701110111810001000910011001101010000100001110110001000112110000010010131101000100111411100001010015111100010101例如,十进制数一51的BCD码为(-51)BCD=101010001十进制数32767的BCD码为(32767)BCD=0001100100111011001112.1.4.2实数
本文标题:数值型数据的表示及处理
链接地址:https://www.777doc.com/doc-8340658 .html