计算机中的数据表示

计算机中的数据表示

在计算机中数值的表现形式称为机器数,机器数采用二进制计数制,数的符号用0和1表示,小数点则隐含,表示不占位置。机器数对应的实际数值称为真值。

机器数有无符号数有符号数(在Java中没有无符号数),其中无符号数没有符号位,表示正数;有符号数的最高位为符号位,符号位0表示正数,1表示负数。

注:本文中假设机器数为8位,◇表示小数点。

原码、反码、补码和移码

原码表示法中,最高位是符号位,其余位表示数值的绝对值。数值0的原码表示有两种形式:[+0]原=0 0000000,[-0]原=1 0000000。

例如:

在这里插入图片描述

反码表示法中,最高位为符号位,正数的反码与原码相同,负数的反码是其绝对值按位取反。数值0的反码有两种形式:[+0]反=0 0000000,[-0]反=1 1111111。

例如:

在这里插入图片描述
注意:Java中没有无符号数,即数值都是有符号位的,其中byte为8位,所以byte中最大的整数为0 1111111,十进制表示为127;而负数的表示为补码,1 0000001表示十进制-127,所以1 0000000表示-128,即byte的范围为-128~127。

补码表示法中,最高位为符号位,正数的补码与原码相同,负数的补码为反码加一。数值0的补码有唯一的表示形式:[0]=0 0000000。

例如:

在这里插入图片描述

移码表示法中,是在数X上增加一个偏移量来表示,常用于表示浮点数中的阶码。如果机器数长为n,规定偏移量为2n-1。实际上,在偏移量为2n-1的情况下,移码的表示只要将补码的符号位取反即可。

例如:
在这里插入图片描述

定点数和浮点数

(1)定点数
定点数就是指小数点位置固定不变的数,定点数中小数点通常有两种约定方式:定点整数(小数点在最低位有效数值位之后)和定点小数(小数点在最高有效数值位之前)。

当机器字长为n时,定点数的补码和移码可以表示2n个数,而其原码和反码只能表示2n-1个数(0占用了两个编码),因此,定点数所能表示的数值范围比较小,在运算中容易溢出

(2)浮点数
浮点数是小数点位置不固定的数,它能表示更大范围的数。在十进制中一个数可以根据小数点位置不同有多种表示形式,例如3.14159可以写成0.0314159102或者是314.15910-2。同样的,在二进制中一个数也可以有多种表示形式,例如二进制数1011.10101可以写成240.101110101或者250.0101110101。

所以,一个二进制数N可以表示为一般形式N=2E*F,其中E称为阶码,F称为尾数。用阶码和尾数表示的数称为浮点数。
在浮点表示法中,阶码为带符号的纯整数,尾数为带符号的纯小数。浮点数的表示格式如下:
在这里插入图片描述
一个浮点数的表示不是唯一的,当小数点的位置改变时,阶码也相应的改变,所以可以用多个浮点形式表示同一个数。
浮点数所能表示的数值范围主要由阶码决定,所表示数值的精度则由尾数决定。为了充分利用尾数来表示更多的有效数字,通常采用规格化浮点数,即将尾数的绝对值限定在区间[0.5,1]。
注意:
如果尾数M>=0,则其规格化的尾数形式为M=0.1xxxx…x,其中x可以为0也可以为1,即将尾数限定在区间[0.5,1]。
如果尾数M<0,则其规格化的尾数形式为M=1.0xxxx…x,其中x可以为0也可以为1,即将尾数限定在区间[-1,-0.5]。
(3)IEEE 754标准
IEEE 754是由IEEE(电气和电子工程师协会)制定的有关浮点数的工业标准,被广泛采用。该标准的表示形式如下:

其中,(-1)S为浮点数的数符,S为1时表示负数;E为阶码,用移码表示;(b0b1b2…bp-1)为尾数,其长度为P。
目前计算机中主要使用三种形式表示IEEE 754浮点数,分别为单精度浮点数、双精度浮点数和扩充精度浮点数。
在这里插入图片描述
根据IEEE 754标准,被编码的值分为3种不同的情况:规格化的值、非规格化的值和特殊值。

①规格化的值:
当阶码部分的二进制值不全为0也不全为1时,所表示的是规格化的值。此时指数的偏移量为+127,尾数部分约定小数点左边隐含一位,通常这位数是1,因此在单精度浮点数尾数的有效位数为24位,即尾数为1.xxx…x。也就是说不溢出的情况下尾数的值在1<=M<2之中。

例如用IEEE 754标准将176.0625表示为单精度浮点数。
1、先将十进制数转换成二进制数:(176.0625)10=(10110000.0001)2
2、再进行规格化处理:1◇01100000001*27
3、去掉b0并拓展为单精度浮点数规定的23位尾数:01100000001000000000000
4、阶码为7+127=134,则指数的移码表示为:10000110
5、最后的到单精度浮点不表示形式:0 10000110 01100000001000000000000

②非规格化的值:
当阶码部分的二进制值全为0时,所表示的数是非规格化的。通常用来表示数值0和非常接近于0的数。

③特殊值:
当阶码部分的二进制全为1是,表示特殊值。
当尾数部分全为0时表无穷大,当符号位为0时表示正无穷大,当符号位为1表示负无穷大。当浮点数运算溢出时,用无穷来表示。
当尾数部分补全为0时,称为“NaN”,不是一个数。

猜你喜欢

转载自blog.csdn.net/is_Javaer/article/details/82820440