您的位置:首页 > 理论基础

信息的表示和处理

2017-02-16 16:05 253 查看

信息存储

字长与字节

字长:每个计算机都有一个字长,对于字长为w位的机器而言,虚拟地址范围为0~2w−1,32位的计算机虚拟地址空间被限定为4GB,当然操作系统有办法解决这一问题。

字节:1byte=8bit。

寻址与字节顺序。对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在存储器中如何排列这些字节。

对象的地址:在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。如,int类型的变量x的地址为0x100,也就是说,地址表达式&x的值为0x100。那么,x的4个字节将被存储在存储器的0x100、0x101、0x102和0x103位置。

字节的排列:排列表示一个对象的字节有两个通用的规则——大端法和小端法。假设变量x类型为int,位于地址0x100处,它的十六进制值为0x01234567。地址范围为0x100~0x103的字节,不同的方法排列顺序如下:



布尔代数简介



位级运算。位级运算就是按位进行布尔运算。这些运算能运用到任何“整型”的数据类型上,以下是一些对char数据类型表达式求值的例子:



掩码运算:位级运算的一个常见用法就是实现掩码运算。掩码是一串二进制代码对目标字段进行位与运算,屏蔽当前的输入位。

例如:掩码0xFF,x=0x89ABCDEF,x&0xFF将得到0x000000EF。

表达式~0将生成一个全1的掩码,不管机器的字大小是多少。

移位运算:

逻辑右移:逻辑右移在左端补k个0。

算数右移:算术右移在左端补k个最高有效位的值。

例子:



对于无符号数据,右移必须是逻辑的。

Java对于如何进行右移有明确的定义。表达式x>>k会将x算术右移k个位置,而x>>>k会对x做逻辑右移。

整数

有符号数的表示

原码表示:最高有效位是符号位,其余表示数值。如:

3 = [00000011]

-3 = [10000011]

反码表示:最高有效位为负权,权重为−(2w−1−1),其余同补码。如:

3 = [00000011]

-3 = [11111100]

表现形式为按位取反,因为最高位相当于掩码。

补码表示:最高有效位为负权,权重为
4000
−2w−1,符号位设置为1时,表示负数,设置为0时,值为非负。如:

3 = [00000011]

-3 = [11111101]

负数的补码是将其正数各位取反之后再加1。补码的范围是不对称的,TMin没有与之对应的正数。

补码是计算机中最常见的有符号数表示方式。Java只支持有符号数,且使用补码运算。

扩展数字

零扩展:在开头补0。

符号扩展:在开头添加最高有效位的副本。

截断数字:直接丢弃高位。如:

int x = 52191;          //1100111111000111
short sx = (short)x;    //1100111111000111-->-12345
int y = sx;             //-12345


整数的运算:补码执行与无符号算术相同的位级实现。对于计算机来说可以按相同方式计算。

浮点数

二进制的小数

首先,我们看下小数的二进制表示。





浮点数的表示

IEEE浮点标准用V=(−1)s×2E×M的形式来表示一个数:

符号(sign):s决定这个数是负数(s=1)还是正数(s=0)。

阶码(exponent):E的作用是对浮点数加权,这个权重是2的E次幂(可能是负数)。

尾数(significand):M是一个二进制小数。



在单精度浮点格式(float)中,s、exp和frac字段分别为1位、k = 8位和n = 23位,得到一个32位的表示。

在双精度浮点格式(double)中,s、exp和frac字段分别为1位、k = 11位和n = 52位,得到一个64位的表示。

根据exp的值,被编码的值可以分成三种不同的情况:



规格化的值:

阶码的位表示为ek−1…e1e0

Bias=2k−1−1(单精度是127,双精度是1023)

E=e−Bias

小数字段frac描述为小数值f,其中0≤f<1,其二进制表示为0.fn−1…f1f0

M=1+f

非规格化的值:

当阶码域为全0时,所表示的数就是非规格化形式。

E=1−Bias

M=f

特殊值:

当阶码域为全1时出现。当小数域全为0时,得到的值表示无穷,s = 0 时是+ ∞, s = 1时是- ∞。当我们把两个非常大的数相乘,或者除以零时,无穷能够表示溢出的结果。当小数域为非零时,结果值被称为“NaN”,就是“不是一个数”(Not a Number)的缩写。

下图展示了假定的8位浮点格式的示例,其中有k=4的阶码位和n=3的小数位。偏置量Bias=7。规格化E=e−7,非规格化E=−6。小数f的值的范围0,18,…,78。



根据其表现形式,我们可以知道浮点数的表示范围及精度:



浮点数的舍入

IEEE浮点格式定义了四种不同的舍入方式:



其中,向偶数舍入又称为最近舍入,这种方式与四舍五入唯一的不同就是对.5的舍入上,采用取偶数的方式。这样是为了避免统计偏差。默认的舍入方式为向偶数舍入。

浮点数的运算

浮点数运算通过一定的步骤,阶码与尾数貌似分别计算,具体暂不做了解。

浮点运算只有有限的范围和精度,而且不遵守普遍的算术属性,比如结合性。使用的时候需要小心。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息