1、计算机数据表示1.二进制计数制引入二进制数字系统的计算机结构和性能具有如下的优点:(1)技术实现容易。(2)二进制运算规则简单。(3)计算机中二进制数的 0、1 数码与逻辑代数变量值 0 与 1 吻合,所以二进制同时可以使计算机方便地进行逻辑运算。(4)二进制数和十进制数之间的关系亦不复杂。2.任意进制计数制和十进制计数制的相互转换十进制数转换成二进制数:十进制数据转换为二进制数时,因整数部分与小数部分转换算法不同,需要分别进行。(1)整数转换方法除基取余法十进制整数除以 2 取余数作最低位系数 k 0 ,再取商的继续除以 2 取余数作高一位的系数,如此继续直到商为 0 时停止,最后一次的余数
2、就是整数部分最高有效位的二进制系数,依次所得到的余数序列就是转换成的二进制数。因为除数 2 是二进制的基数,所以这种算法称作“除基取余”法。(2)小数转换方法乘基取整法把十进制小数乘以 2,取其积的整数部分作为对应二进制小数的最高位系数 k -1 ,再取积的纯小数部分乘以 2,新得积的整数部分又作下一位的系数 k -2 ,再取其积的纯小数部分继续乘 2,直到乘积小数部分为 0 时停止,这时乘积的整数部分是二进制数最低位系数,每次乘积得到的整数序列就是所求的二进制小数,这种方法每次乘以基数取其整数作系数。所以叫乘基取整法。需要指出的是并不是所有十进制小数都能转换成有限位的二进制小数并出现乘积的小
3、数部分 0 的情况,有时整个换算过程会无限进行下去,此时可以根据要求并考虑计算机字长,取一定长度的位数后四舍五入,这时得到的二进制数是原十进制数的近似值。一个既有整数部分又有小数的数送入计算机后,由机器把整数部分按“除基取余”法,小数部分按 “乘基取整 ”法分别进行转换,然后合并。任意进制数转换成十进制数:任意一种进位计数制的数转换成十进制数的方法都是一样的。把任意进制数按权展开成多项式和的形式,把各位的权与该位上的数码相乘,乘积逐项相加,其和便是相应的十进制数。十进制数转换成任意进制数:十进制数转换成任意进制数与十进制数转换成二进制数的方法完全相同,即整数部分用除基取余的算法,小数部分用乘基
4、取整的方法,然后将整数与小数拼接成一个数作为转换的最后结果。3.数的机器码表示符号数的机器码表示:(1)机器数和真值 数在计算机中的表示形式统称为机器数。机器数有两个基本特点,其一,数的符号数值化。实用的数据有正数和负数,因为计算机只能表示 0、1 两种状态,数据的正号“+” 或负号“-”,在机器里就用一位二进制的 0 或 1 来区别。通常这个符号放在二进制数的最高位,称符号位,以 0 代表符号“+”,以 1 代表符号“-”,这样正负符号就被数值化了。因为有符号占据一位,数的形式值就不等于真正的数值,带符号位的机器数对应的数值称为机器数的真值。机器数的另一个特点是二进制的位数受机器设备的限制。
5、机器内部设备一次能表示的二进制位数叫机器的字长,一台机器的字长是固定的。字长 8 位叫一个字节(Byte ),现在机器字长一般都是字节的整数倍,如字长 8 位、16 位、32位、64 位。符号位数值化之后,为能方便的对机器数进行算术运算、提高运算速度,计算机设计了多种符号位与数值一起编码的方法,最常用的机器数表示方法有三种:原码、反码和补码。(2)原码表示法和反码表示法一个机器数 X 由符号位和有效数值两部分组成。设符号位为 X 0 ,X 真值的绝对值|X|=X 1 X 2 X n ,X 的机器数原码表示为:X原 =X0X1X2Xn 当 X0 时,X0 =0当 X0 时,X0 =1原码表示很直
6、观,但原码加减运算时符号位不能视同数值一样参加运算,运算规则复杂,运算时间长,而计算机大量的数据处理工作是加减运算,原码表示就很不方便了。一个负数的原码符号位不动,其余各位取相反码就是机器数的另一种表示形式反码表示法。正数的反码与原码相同。设X 原 =X0X1X2Xn当 X0 =0 时, X反 =X0X1X2Xn 当 X0 =1 时, X反 =X0X1X2Xn (3)补码表示法(complement)设计补码表示法的目的是:使符号位能和有效数值部分一起参加数值运算从而简化运算规则,节省运算时间。使减法运算转化成加法运算,从而进一步简化计算机中运算器的线路设计。计算机是一种有限字长的数字系统,因
7、此都是有模运算,超过模的运算结果都将溢出。n 位二进制整数的模是 2 n 。对于二进制数还有一种更加简单的方法由原码求得补码。正数的补码表示与原码一样,X 补 =X 原负数的补码是将原码符号位保持“1”之后其余各位取相反的码,末位加 1 便得到补码,即取其原码的反码再加 1X 补 =X 反 +1。真值+0 和-0 的补码表示是一致的,但在原码和反码表示中具有不同的形式。8位补码机器数可以表示-128,但不存在+128 的补码,由此可知 8 位二进制补码能表示数的范围是-128+127。应该注意,不存在-128 的 8 位原码和反码形式。根据互补的概念,一个补码机器数再求一次补就得到机器数的原码
8、了。定点数与浮点数:(1)定点数(fixed-point number)计算机处理的数据不仅有符号,而且大量的数带有小数,小数点不占有二进制位而是隐含有机器数里某固定位置上。通常采用两种简单的约定:一种是约定所有机器数的小数点位置隐含在机器数的最低位之后,叫定点纯整数机器数,简称定点整数。另一种约定是所有机器数的小数点位置隐含在符号位之后、有效数值部分最高位之前,叫定点纯小数机器数,简称定点小数。计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按比例因子缩小成定点小数或扩大成定点整数再参加运算,结果输出时再按比例折算成实际值。n 位原码定点整数的表示范围是-(
9、2 n-1 -1)X2 n-1 -1,n 位原码定点小数的表示范围是-(1-2 -(n-1) )X1-2 -(n-1) 。当机器数小于定点数的最小值时,被当作 0 处理,超出定点数的最大值时,机器无法表达,称作“溢出” ,此时机器将停止运算,屏幕显示溢出警告。 定点数表示方法简单直观,不过定点数表示数的范围小,不易选择合适的比例因子,运算过程容易产生溢出。 摘自计算机数据表示1.二进制计数制引入二进制数字系统的计算机结构和性能具有如下的优点:(1)技术实现容易。(2)二进制运算规则简单。(3)计算机中二进制数的 0、1 数码与逻辑代数变量值 0 与 1 吻合,所以二进制同时可以使计算机方便地进
10、行逻辑运算。(4)二进制数和十进制数之间的关系亦不复杂。2.任意进制计数制和十进制计数制的相互转换十进制数转换成二进制数:十进制数据转换为二进制数时,因整数部分与小数部分转换算法不同,需要分别进行。(1)整数转换方法除基取余法十进制整数除以 2 取余数作最低位系数 k 0 ,再取商的继续除以 2 取余数作高一位的系数,如此继续直到商为 0 时停止,最后一次的余数就是整数部分最高有效位的二进制系数,依次所得到的余数序列就是转换成的二进制数。因为除数 2 是二进制的基数,所以这种算法称作“除基取余”法。(2)小数转换方法乘基取整法把十进制小数乘以 2,取其积的整数部分作为对应二进制小数的最高位系数
11、 k -1 ,再取积的纯小数部分乘以 2,新得积的整数部分又作下一位的系数 k -2 ,再取其积的纯小数部分继续乘 2,直到乘积小数部分为 0 时停止,这时乘积的整数部分是二进制数最低位系数,每次乘积得到的整数序列就是所求的二进制小数,这种方法每次乘以基数取其整数作系数。所以叫乘基取整法。需要指出的是并不是所有十进制小数都能转换成有限位的二进制小数并出现乘积的小数部分 0 的情况,有时整个换算过程会无限进行下去,此时可以根据要求并考虑计算机字长,取一定长度的位数后四舍五入,这时得到的二进制数是原十进制数的近似值。一个既有整数部分又有小数的数送入计算机后,由机器把整数部分按“除基取余”法,小数部
12、分按 “乘基取整 ”法分别进行转换,然后合并。任意进制数转换成十进制数:任意一种进位计数制的数转换成十进制数的方法都是一样的。把任意进制数按权展开成多项式和的形式,把各位的权与该位上的数码相乘,乘积逐项相加,其和便是相应的十进制数。十进制数转换成任意进制数:十进制数转换成任意进制数与十进制数转换成二进制数的方法完全相同,即整数部分用除基取余的算法,小数部分用乘基取整的方法,然后将整数与小数拼接成一个数作为转换的最后结果。3.数的机器码表示符号数的机器码表示:(1)机器数和真值 数在计算机中的表示形式统称为机器数。机器数有两个基本特点,其一,数的符号数值化。实用的数据有正数和负数,因为计算机只能
13、表示 0、1 两种状态,数据的正号“+” 或负号“-”,在机器里就用一位二进制的 0 或 1 来区别。通常这个符号放在二进制数的最高位,称符号位,以 0 代表符号“+”,以 1 代表符号“-”,这样正负符号就被数值化了。因为有符号占据一位,数的形式值就不等于真正的数值,带符号位的机器数对应的数值称为机器数的真值。机器数的另一个特点是二进制的位数受机器设备的限制。机器内部设备一次能表示的二进制位数叫机器的字长,一台机器的字长是固定的。字长 8 位叫一个字节(Byte ),现在机器字长一般都是字节的整数倍,如字长 8 位、16 位、32位、64 位。符号位数值化之后,为能方便的对机器数进行算术运算
14、、提高运算速度,计算机设计了多种符号位与数值一起编码的方法,最常用的机器数表示方法有三种:原码、反码和补码。(2)原码表示法和反码表示法一个机器数 X 由符号位和有效数值两部分组成。设符号位为 X 0 ,X 真值的绝对值|X|=X 1 X 2 X n ,X 的机器数原码表示为:X原 =X0X1X2Xn 当 X0 时,X0 =0当 X0 时,X0 =1原码表示很直观,但原码加减运算时符号位不能视同数值一样参加运算,运算规则复杂,运算时间长,而计算机大量的数据处理工作是加减运算,原码表示就很不方便了。一个负数的原码符号位不动,其余各位取相反码就是机器数的另一种表示形式反码表示法。正数的反码与原码相
15、同。设X 原 =X0X1X2Xn当 X0 =0 时, X反 =X0X1X2Xn 当 X0 =1 时, X反 =X0X1X2Xn (3)补码表示法(complement)设计补码表示法的目的是:使符号位能和有效数值部分一起参加数值运算从而简化运算规则,节省运算时间。使减法运算转化成加法运算,从而进一步简化计算机中运算器的线路设计。计算机是一种有限字长的数字系统,因此都是有模运算,超过模的运算结果都将溢出。n 位二进制整数的模是 2 n 。对于二进制数还有一种更加简单的方法由原码求得补码。正数的补码表示与原码一样,X 补 =X 原负数的补码是将原码符号位保持“1”之后其余各位取相反的码,末位加 1
16、 便得到补码,即取其原码的反码再加 1X 补 =X 反 +1。真值+0 和-0 的补码表示是一致的,但在原码和反码表示中具有不同的形式。8位补码机器数可以表示-128,但不存在+128 的补码,由此可知 8 位二进制补码能表示数的范围是-128+127。应该注意,不存在-128 的 8 位原码和反码形式。根据互补的概念,一个补码机器数再求一次补就得到机器数的原码了。定点数与浮点数:(1)定点数(fixed-point number)计算机处理的数据不仅有符号,而且大量的数带有小数,小数点不占有二进制位而是隐含有机器数里某固定位置上。通常采用两种简单的约定:一种是约定所有机器数的小数点位置隐含在
17、机器数的最低位之后,叫定点纯整数机器数,简称定点整数。另一种约定是所有机器数的小数点位置隐含在符号位之后、有效数值部分最高位之前,叫定点纯小数机器数,简称定点小数。计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按比例因子缩小成定点小数或扩大成定点整数再参加运算,结果输出时再按比例折算成实际值。n 位原码定点整数的表示范围是-(2 n-1 -1)X2 n-1 -1,n 位原码定点小数的表示范围是-(1-2 -(n-1) )X1-2 -(n-1) 。当机器数小于定点数的最小值时,被当作 0 处理,超出定点数的最大值时,机器无法表达,称作“溢出” ,此时机器将停止
18、运算,屏幕显示溢出警告。 定点数表示方法简单直观,不过定点数表示数的范围小,不易选择合适的比例因子,运算过程容易产生溢出。 计算机数据表示1.二进制计数制引入二进制数字系统的计算机结构和性能具有如下的优点:(1)技术实现容易。(2)二进制运算规则简单。(3)计算机中二进制数的 0、1 数码与逻辑代数变量值 0 与 1 吻合,所以二进制同时可以使计算机方便地进行逻辑运算。(4)二进制数和十进制数之间的关系亦不复杂。2.任意进制计数制和十进制计数制的相互转换十进制数转换成二进制数:十进制数据转换为二进制数时,因整数部分与小数部分转换算法不同,需要分别进行。(1)整数转换方法除基取余法十进制整数除以
19、 2 取余数作最低位系数 k 0 ,再取商的继续除以 2 取余数作高一位的系数,如此继续直到商为 0 时停止,最后一次的余数就是整数部分最高有效位的二进制系数,依次所得到的余数序列就是转换成的二进制数。因为除数 2 是二进制的基数,所以这种算法称作“除基取余”法。(2)小数转换方法乘基取整法把十进制小数乘以 2,取其积的整数部分作为对应二进制小数的最高位系数 k -1 ,再取积的纯小数部分乘以 2,新得积的整数部分又作下一位的系数 k -2 ,再取其积的纯小数部分继续乘 2,直到乘积小数部分为 0 时停止,这时乘积的整数部分是二进制数最低位系数,每次乘积得到的整数序列就是所求的二进制小数,这种
20、方法每次乘以基数取其整数作系数。所以叫乘基取整法。需要指出的是并不是所有十进制小数都能转换成有限位的二进制小数并出现乘积的小数部分 0 的情况,有时整个换算过程会无限进行下去,此时可以根据要求并考虑计算机字长,取一定长度的位数后四舍五入,这时得到的二进制数是原十进制数的近似值。一个既有整数部分又有小数的数送入计算机后,由机器把整数部分按“除基取余”法,小数部分按 “乘基取整 ”法分别进行转换,然后合并。任意进制数转换成十进制数:任意一种进位计数制的数转换成十进制数的方法都是一样的。把任意进制数按权展开成多项式和的形式,把各位的权与该位上的数码相乘,乘积逐项相加,其和便是相应的十进制数。十进制数
21、转换成任意进制数:十进制数转换成任意进制数与十进制数转换成二进制数的方法完全相同,即整数部分用除基取余的算法,小数部分用乘基取整的方法,然后将整数与小数拼接成一个数作为转换的最后结果。3.数的机器码表示符号数的机器码表示:(1)机器数和真值 数在计算机中的表示形式统称为机器数。机器数有两个基本特点,其一,数的符号数值化。实用的数据有正数和负数,因为计算机只能表示 0、1 两种状态,数据的正号“+” 或负号“-”,在机器里就用一位二进制的 0 或 1 来区别。通常这个符号放在二进制数的最高位,称符号位,以 0 代表符号“+”,以 1 代表符号“-”,这样正负符号就被数值化了。因为有符号占据一位,
22、数的形式值就不等于真正的数值,带符号位的机器数对应的数值称为机器数的真值。机器数的另一个特点是二进制的位数受机器设备的限制。机器内部设备一次能表示的二进制位数叫机器的字长,一台机器的字长是固定的。字长 8 位叫一个字节(Byte ),现在机器字长一般都是字节的整数倍,如字长 8 位、16 位、32位、64 位。符号位数值化之后,为能方便的对机器数进行算术运算、提高运算速度,计算机设计了多种符号位与数值一起编码的方法,最常用的机器数表示方法有三种:原码、反码和补码。(2)原码表示法和反码表示法一个机器数 X 由符号位和有效数值两部分组成。设符号位为 X 0 ,X 真值的绝对值|X|=X 1 X
23、2 X n ,X 的机器数原码表示为:X原 =X0X1X2Xn 当 X0 时,X0 =0当 X0 时,X0 =1原码表示很直观,但原码加减运算时符号位不能视同数值一样参加运算,运算规则复杂,运算时间长,而计算机大量的数据处理工作是加减运算,原码表示就很不方便了。一个负数的原码符号位不动,其余各位取相反码就是机器数的另一种表示形式反码表示法。正数的反码与原码相同。设X 原 =X0X1X2Xn当 X0 =0 时, X反 =X0X1X2Xn 当 X0 =1 时, X反 =X0X1X2Xn (3)补码表示法(complement)设计补码表示法的目的是:使符号位能和有效数值部分一起参加数值运算从而简化
24、运算规则,节省运算时间。使减法运算转化成加法运算,从而进一步简化计算机中运算器的线路设计。计算机是一种有限字长的数字系统,因此都是有模运算,超过模的运算结果都将溢出。n 位二进制整数的模是 2 n 。对于二进制数还有一种更加简单的方法由原码求得补码。正数的补码表示与原码一样,X 补 =X 原负数的补码是将原码符号位保持“1”之后其余各位取相反的码,末位加 1 便得到补码,即取其原码的反码再加 1X 补 =X 反 +1。真值+0 和-0 的补码表示是一致的,但在原码和反码表示中具有不同的形式。8位补码机器数可以表示-128,但不存在+128 的补码,由此可知 8 位二进制补码能表示数的范围是-1
25、28+127。应该注意,不存在-128 的 8 位原码和反码形式。根据互补的概念,一个补码机器数再求一次补就得到机器数的原码了。定点数与浮点数:(1)定点数(fixed-point number)计算机处理的数据不仅有符号,而且大量的数带有小数,小数点不占有二进制位而是隐含有机器数里某固定位置上。通常采用两种简单的约定:一种是约定所有机器数的小数点位置隐含在机器数的最低位之后,叫定点纯整数机器数,简称定点整数。另一种约定是所有机器数的小数点位置隐含在符号位之后、有效数值部分最高位之前,叫定点纯小数机器数,简称定点小数。计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子
26、,数据按比例因子缩小成定点小数或扩大成定点整数再参加运算,结果输出时再按比例折算成实际值。n 位原码定点整数的表示范围是-(2 n-1 -1)X2 n-1 -1,n 位原码定点小数的表示范围是-(1-2 -(n-1) )X1-2 -(n-1) 。当机器数小于定点数的最小值时,被当作 0 处理,超出定点数的最大值时,机器无法表达,称作“溢出” ,此时机器将停止运算,屏幕显示溢出警告。 定点数表示方法简单直观,不过定点数表示数的范围小,不易选择合适的比例因子,运算过程容易产生溢出。摘自计算机数据表示1.二进制计数制引入二进制数字系统的计算机结构和性能具有如下的优点:(1)技术实现容易。(2)二进制
27、运算规则简单。(3)计算机中二进制数的 0、1 数码与逻辑代数变量值 0 与 1 吻合,所以二进制同时可以使计算机方便地进行逻辑运算。(4)二进制数和十进制数之间的关系亦不复杂。2.任意进制计数制和十进制计数制的相互转换十进制数转换成二进制数:十进制数据转换为二进制数时,因整数部分与小数部分转换算法不同,需要分别进行。(1)整数转换方法除基取余法十进制整数除以 2 取余数作最低位系数 k 0 ,再取商的继续除以 2 取余数作高一位的系数,如此继续直到商为 0 时停止,最后一次的余数就是整数部分最高有效位的二进制系数,依次所得到的余数序列就是转换成的二进制数。因为除数 2 是二进制的基数,所以这
28、种算法称作“除基取余”法。(2)小数转换方法乘基取整法把十进制小数乘以 2,取其积的整数部分作为对应二进制小数的最高位系数 k -1 ,再取积的纯小数部分乘以 2,新得积的整数部分又作下一位的系数 k -2 ,再取其积的纯小数部分继续乘 2,直到乘积小数部分为 0 时停止,这时乘积的整数部分是二进制数最低位系数,每次乘积得到的整数序列就是所求的二进制小数,这种方法每次乘以基数取其整数作系数。所以叫乘基取整法。需要指出的是并不是所有十进制小数都能转换成有限位的二进制小数并出现乘积的小数部分 0 的情况,有时整个换算过程会无限进行下去,此时可以根据要求并考虑计算机字长,取一定长度的位数后四舍五入,
29、这时得到的二进制数是原十进制数的近似值。一个既有整数部分又有小数的数送入计算机后,由机器把整数部分按“除基取余”法,小数部分按 “乘基取整 ”法分别进行转换,然后合并。任意进制数转换成十进制数:任意一种进位计数制的数转换成十进制数的方法都是一样的。把任意进制数按权展开成多项式和的形式,把各位的权与该位上的数码相乘,乘积逐项相加,其和便是相应的十进制数。十进制数转换成任意进制数:十进制数转换成任意进制数与十进制数转换成二进制数的方法完全相同,即整数部分用除基取余的算法,小数部分用乘基取整的方法,然后将整数与小数拼接成一个数作为转换的最后结果。3.数的机器码表示符号数的机器码表示:(1)机器数和真
30、值 数在计算机中的表示形式统称为机器数。机器数有两个基本特点,其一,数的符号数值化。实用的数据有正数和负数,因为计算机只能表示 0、1 两种状态,数据的正号“+” 或负号“-”,在机器里就用一位二进制的 0 或 1 来区别。通常这个符号放在二进制数的最高位,称符号位,以 0 代表符号“+”,以 1 代表符号“-”,这样正负符号就被数值化了。因为有符号占据一位,数的形式值就不等于真正的数值,带符号位的机器数对应的数值称为机器数的真值。机器数的另一个特点是二进制的位数受机器设备的限制。机器内部设备一次能表示的二进制位数叫机器的字长,一台机器的字长是固定的。字长 8 位叫一个字节(Byte ),现在
31、机器字长一般都是字节的整数倍,如字长 8 位、16 位、32位、64 位。符号位数值化之后,为能方便的对机器数进行算术运算、提高运算速度,计算机设计了多种符号位与数值一起编码的方法,最常用的机器数表示方法有三种:原码、反码和补码。(2)原码表示法和反码表示法一个机器数 X 由符号位和有效数值两部分组成。设符号位为 X 0 ,X 真值的绝对值|X|=X 1 X 2 X n ,X 的机器数原码表示为:X原 =X0X1X2Xn 当 X0 时,X0 =0当 X0 时,X0 =1原码表示很直观,但原码加减运算时符号位不能视同数值一样参加运算,运算规则复杂,运算时间长,而计算机大量的数据处理工作是加减运算
32、,原码表示就很不方便了。一个负数的原码符号位不动,其余各位取相反码就是机器数的另一种表示形式反码表示法。正数的反码与原码相同。设X 原 =X0X1X2Xn当 X0 =0 时, X反 =X0X1X2Xn 当 X0 =1 时, X反 =X0X1X2Xn (3)补码表示法(complement)设计补码表示法的目的是:使符号位能和有效数值部分一起参加数值运算从而简化运算规则,节省运算时间。使减法运算转化成加法运算,从而进一步简化计算机中运算器的线路设计。计算机是一种有限字长的数字系统,因此都是有模运算,超过模的运算结果都将溢出。n 位二进制整数的模是 2 n 。对于二进制数还有一种更加简单的方法由原
33、码求得补码。正数的补码表示与原码一样,X 补 =X 原负数的补码是将原码符号位保持“1”之后其余各位取相反的码,末位加 1 便得到补码,即取其原码的反码再加 1X 补 =X 反 +1。真值+0 和-0 的补码表示是一致的,但在原码和反码表示中具有不同的形式。8位补码机器数可以表示-128,但不存在+128 的补码,由此可知 8 位二进制补码能表示数的范围是-128+127。应该注意,不存在-128 的 8 位原码和反码形式。根据互补的概念,一个补码机器数再求一次补就得到机器数的原码了。定点数与浮点数:(1)定点数(fixed-point number)计算机处理的数据不仅有符号,而且大量的数带
34、有小数,小数点不占有二进制位而是隐含有机器数里某固定位置上。通常采用两种简单的约定:一种是约定所有机器数的小数点位置隐含在机器数的最低位之后,叫定点纯整数机器数,简称定点整数。另一种约定是所有机器数的小数点位置隐含在符号位之后、有效数值部分最高位之前,叫定点纯小数机器数,简称定点小数。计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按比例因子缩小成定点小数或扩大成定点整数再参加运算,结果输出时再按比例折算成实际值。n 位原码定点整数的表示范围是-(2 n-1 -1)X2 n-1 -1,n 位原码定点小数的表示范围是-(1-2 -(n-1) )X1-2 -(n-
35、1) 。当机器数小于定点数的最小值时,被当作 0 处理,超出定点数的最大值时,机器无法表达,称作“溢出” ,此时机器将停止运算,屏幕显示溢出警告。 定点数表示方法简单直观,不过定点数表示数的范围小,不易选择合适的比例因子,运算过程容易产生溢出数值在计算机中表示形式为机器数,计算机只能识别 0 和 1,使用的是二进制,而在日常生活中人们使用的是十进制.数值有正负之分,计算机就用一个数的最高位存放符号 (0 为正,1 为负). 这就是机器数的原码了.假设机器能处理的位数为 8.即字长为 1byte,原码能表示数值的范围为(-127-0 +0127)共 256 个.有了数值的表示方法就可以对数进行算
36、术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题 ,如下: 假设字长为 8bits( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10(00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 显然不正确.因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上,对除符号位外的其余各位逐位取反就产生了反码. 反码的取值空间和原码相同且一一对应. 下面是反码的减法运算 :( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10=
37、 ( 0 )10(00000001) 反+ (11111110)反 = (11111111)反 = ( -0 ) 有问题.( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10(00000001) 反+ (11111101)反 = (11111110)反 = ( -1 ) 正确问题出现在(+0)和(-0)上, 在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大).于是就引入了补码概念. 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用 (-128
38、)代替了(-0), 所以补码的表示范围为:(-1280127)共 256 个.注意:(-128)没有相对应的原码和反码, (-128) = (10000000) 补码的加减运算如下:( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10(00000001)补 + (11111111)补 = (00000000)补 = ( 0 ) 正确( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10(00000001) 补+ (11111110) 补= (11111111)补 = ( -1 ) 正确所以补码的设计目的是:使
39、符号位能与有效值部分一起参加运算,从而简化运算规则 .使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C 等其他高级语言中使用的都是原码。-补码 反码 二进制理解有符号数和无符号数回头看上一节,我们所讲的数都是正数。同样是年纪和工资,前者不需要有负值,但后者可能需要至少所有的老板都这样认为。那么,负数在计算机中如何表示呢?这一点,你可能听过两种不同的回答。一种是教科书,它会告诉你:计算机用“补码”表示负数。可是有关“补码”的概念一说就得一节课,这一些我们需要在第 6 章中用一章的篇幅讲 2 进制的一切。再者,用“补码”表示
40、负数,其实一种公式,公式的作用在于告诉你,想得问题的答案,应该如何计算。却并没有告诉你为什么用这个公式就可以和答案? 另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高位是 0,表示正数,最高位是 1,表示负数。这种说法本身没错,可是如果没有下文,那么它就是错的。至少它不能解释,为什么字符类型的-1 用二进制表示是“1111 1111”(16 进制为 FF);而不是我们更能理解的“1000 0001”。 (为什么说后者更好理解呢?因为既然说最高位是 1 时表示负数,那 1000 0001 不是正好是-1 吗?) 。让我们从头说起。1、你自已决定是否需要有正负。就像我们必须决定某个量使
41、用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。在计算机中,可以区分正负的类型,称为有符类型,无正负的类型(只有正值) ,称为无符类型。数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型。字符类型也分为有符和无符类型。比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。2、使用二制数中的最高位表示正负。首先得知道最高位是哪一位?1 个字节的类型,如字符类型,最高位是第 7 位,2 个字节的数,最高位是第 15 位,4 个字节的数,最高位是第 31 位。不同长度
42、的数值类型,其最高位也就不同,但总是最左边的那位(如下示意) 。字符类型固定是 1 个字节,所以最高位总是第 7 位。(红色为最高位)单字节数: 1111 1111双字节数: 1111 1111 1111 1111四字节数: 1111 1111 1111 1111 1111 1111 1111 1111当我们指定一个数量是无符号类型时,那么其最高位的 1 或 0,和其它位一样,用来表示该数的大小。当我们指定一个数量是无符号类型时,此时,最高数称为“符号位” 。为 1 时,表示该数为负值,为 0 时表示为正值。3、无符号数和有符号数的范围区别。无符号数中,所有的位都用于直接表示该值的大小。有符号
43、数中最高位用于表示正负,所以,当为正值时,该数的最大值就会变小。我们举一个字节的数值对比:无符号数: 1111 1111 值:255 1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20有符号数: 0111 1111 值:127 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20同样是一个字节,无符号数的最大值是 255,而有符号数的最大值是 127。原因是有符号数中的最高位被挪去表示符号了。并且,我们知道,最高位的权值也是最高的(对于 1 字节数来说是 2 的 7 次
44、方=128) ,所以仅仅少于一位,最大值一下子减半。不过,有符号数的长处是它可以表示负数。因此,虽然它的在最大值缩水了,却在负值的方向出现了伸展。我们仍一个字节的数值对比:无符号数: 0 - 255有符号数: -128 - 0 - 127同样是一个字节,无符号的最小值是 0 ,而有符号数的最小值是-128 。所以二者能表达的不同的数值的个数都一样是 256 个。只不过前者表达的是 0 到 255这 256 个数,后者表达的是-128 到+127 这 256 个数。一个有符号的数据类型的最小值是如何计算出来的呢?有符号的数据类型的最大值的计算方法完全和无符号一样,只不过它少了一个最高位(见第 3
45、 点) 。但在负值范围内,数值的计算方法不能直接使用 1* 26 + 1* 25 的公式进行转换。在计算机中,负数除为最高位为 1 以外,还采用补码形式进行表达。所以在计算其值前,需要对补码进行还原。这些内容我们将在第六章中的二进制知识中统一学习。这里,先直观地看一眼补码的形式:以我们原有的数学经验,在 10 进制中:1 表示正 1,而加上负号:-1 表示和 1相对的负值。那么,我们会很容易认为在 2 进制中(1 个字节): 0000 0001 表示正 1,则高位为 1 后:1000 0001 应该表示 -1。然而,事实上计算机中的规定有些相反,请看下表:二进制值(1 字节)十进制值1000
46、0000-1281000 0001-1271000 0010-1261000 0011-125.1111 1110-21111 1111-1首先我们看到,从-1 到-128,其二进制的最高位都是 1(表中标为红色) ,正如我们前面的学。然后我们有些奇怪地发现,1000 0000 并没有拿来表示 -0;而 1000 0001 也不是拿来直观地表示-1。事实上,-1 用 1111 1111 来表示。怎么理解这个问题呢?先得问一句是-1 大还是-128 大?当然是 -1 大。-1 是最大的负整数。以此对应,计算机中无论是字符类型,或者是整数类型,也无论这个整数是几个字节。它都用全 1 来表示 -1。
47、比如一个字节的数值中:1111 1111 表示-1,那么,1111 1111 - 1 是什么呢?和现实中的计算结果完全一致。1111 1111 - 1 = 1111 1110,而 1111 1110 就是-2。这样一直减下去,当减到只剩最高位用于表示符号的 1 以外,其它低位全为 0 时,就是最小的负值了,在一字节中,最小的负值是 1000 0000,也就是-128。我们以-1 为例,来看看不同字节数的整数中,如何表达-1 这个数:字节数二进制值十进制值单字节数1111 1111-1双字节数1111 1111 1111 1111-1四字节数1111 1111 1111 1111 1111 11
48、11 1111 1111-1可能有同学这时会混了:为什么 1111 1111 有时表示 255,有时又表示-1?所以我再强调一下本节前面所说的第 2 点:你自已决定一个数是有符号还是无符号的。写程序时,指定一个量是有符号的,那么当这个量的二进制各位上都是1 时,它表示的数就是-1;相反,如果事选声明这个量是无符号的,此时它表示的就是该量允许的最大值,对于一个字节的数来说,最大值就是 255。原码、反码、补码我们已经知道计算机中,所有数据最终都是使用二进制数表达。我们也已经学会如何将一个 10 进制数如何转换为二进制数。不过,我们仍然没有学习一个负数如何用二进制表达。比如,假设有一 int 类型
49、的数,值为 5,那么,我们知道它在计算机中表示为:00000000 00000000 00000000 000001015 转换成二制是 101,不过 int 类型的数占用 4 字节(32 位) ,所以前面填了一堆 0。现在想知道,-5 在计算机中如何表示?在计算机中,负数以其正值的补码形式表达。什么叫补码呢?这得从原码,反码说起。原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。比如 00000000 00000000 00000000 00000101 是 5 的 原码。反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。取反操作指:原为 1,得 0;原为 0,得 1。 (1 变 0; 0 变 1)比如:将 00000000 0000