您的位置:首页 > 其它

02信息的表示和处理

2018-02-06 17:50 106 查看

字节顺序

小端

最低有效字节在最前面

大多数Intel兼容机

0x01234567

地址0x1000x1010x1020x103
数据67452301

大端

最高有效字节在最前面

大多数IBM和Sun Microsystems

网络应用程序发送和接受的数据

0x01234567

地址0x1000x1010x1020x103
数据01234567

双端

可以设置成大端或者小端

移位运算

逻辑移位(
>>>
,
<<<
)

左移和右移补0

算术移位(
>>
,
<<
)

左移补符号位,右移补0

整数表示

32位机器C语言的整型数据类型的典型取值范围

数据类型最小值最大值
char-128127
unsigned char0255
short [int]-3276832767
unsigned short [int]065535
int-21474836482147483647
unsigned [int]04294967295
long [int]-21474836482147483647
unsigned long [int]04294967295
long long [int]-92233720368547758089223372036854775807
unsigned long long [int]018446744073709551615

64位机器C语言的整型数据类型的典型取值范围

数据类型最小值最大值
char-128127
unsigned char0255
short [int]-3276832767
unsigned short [int]065535
int-21474836482147483647
unsigned [int]04294967295
long [int]-92233720368547758089223372036854775807
unsigned long [int]018446744073709551615
long long [int]-92233720368547758089223372036854775807
unsigned long long [int]018446744073709551615

无符号数

假设一个整数数据有ww位,可以将位向量写成x→x→表示整个向量,或者写成[xw−1,xw−2,…,x0][xw−1,xw−2,…,x0]表示向量中的每一位

二进制转无符号数

B2Uw(x→)≐∑i=0w−1xi2iB2Uw(x→)≐∑i=0w−1xi2i

有符号数

原码编码

B2Sw(x→)≐(−1)xw−1∑i=0w−2xi2iB2Sw(x→)≐(−1)xw−1∑i=0w−2xi2i

反码编码

B2Ow(x→)≐−xw−1(2w−1−1)+∑i=0w−2xi2iB2Ow(x→)≐−xw−1(2w−1−1)+∑i=0w−2xi2i

补码编码

B2Tw(x→)≐−xw−12w−1+∑i=0w−2xi2iB2Tw(x→)≐−xw−12w−1+∑i=0w−2xi2i

最高有效位xw−1xw−1称为符号位,权重为−2w−1−2w−1

B2TwB2Tw是一个从长度为ww的位模式到TMinwTMinw和TMaxwTMaxw之间数字的映射,写做

B2Tw:{0,1}w→{−2w−1,…,2w−1−1}B2Tw:{0,1}w→{−2w−1,…,2w−1−1}

注意

|TMinw|=|TMaxw|+1|TMinw|=|TMaxw|+1

UMaxw=2TMaxw+1UMaxw=2TMaxw+1

有符号数和无符号数转换

无符号数到补码

U2Tw(x)≐B2Tw(U2Bw(x))={uu−2wu<2w−1u≥2w−1U2Tw(x)≐B2Tw(U2Bw(x))={uu<2w−1u−2wu≥2w−1

补码到无符号数

T2Uw(x)≐B2Uw(T2Bw(x))={x+2wxx<0x≥0T2Uw(x)≐B2Uw(T2Bw(x))={x+2wx<0xx≥0

扩展数位

零扩展

无符号数转换为一个更大的数据类型,只需要简单地在表示的开头添加0

B2Uw+k([0,...,xw−1,xw−2,...,x0])=B2Uw([xw−1,xw−2,...,x0])B2Uw+k([0,...,xw−1,xw−2,...,x0])=B2Uw([xw−1,xw−2,...,x0])

符号扩展

将一个补码数字转换为一个更大的数据类型,需要添加最高有效位的值的副本

B2Tw+k([xw−1,...,xw−1,xw−2,...,x0])=B2Tw([xw−1,xw−2,...,x0])B2Tw+k([xw−1,...,xw−1,xw−2,...,x0])=B2Tw([xw−1,xw−2,...,x0])

截断数字

无符号数的截断结果

B2Uk([xk−1,xk−2,...,x0])=B2Uw([xw−1,xw−2,...,x0]) mod 2kB2Uk([xk−1,xk−2,...,x0])=B2Uw([xw−1,xw−2,...,x0]) mod 2k

有符号数补码的截断结果

B2Tk([xk−1,xk−2,...,x0])=U2Tw(B2Uw([xw−1,xw−2,...,x0]) mod 2k)B2Tk([xk−1,xk−2,...,x0])=U2Tw(B2Uw([xw−1,xw−2,...,x0]) mod 2k)

整数运算

无符号数加法

x+uwy={x+yx+y−2wx+y<2w2w≤x+y<2w+1x+wuy={x+yx+y<2wx+y−2w2w≤x+y<2w+1

有符号数补码加法

x+twy=U2Tw(T2Uw(x)+uwT2Uw(y))=U2Tw[(xw−12w+x+yw−12w+y) mod 2w]=U2Tw[(x+y) mod 2w]=⎧⎩⎨⎪⎪x+y−2wx+yx+y+2w2w−1≤x+y−2w−1≤x+y<2w−1x+y<−2w−1正溢出正常负溢出x+wty=U2Tw(T2Uw(x)+wuT2Uw(y))=U2Tw[(xw−12w+x+yw−12w+y) mod 2w]=U2Tw[(x+y) mod 2w]={x+y−2w2w−1≤x+y正溢出x+y−2w−1≤x+y<2w−1正常x+y+2wx+y<−2w−1负溢出

有符号数补码的非

−twx={−2w−1−xx=−2w−1x>−2w−1−wtx={−2w−1x=−2w−1−xx>−2w−1

无符号数乘法

x∗uwy=(x⋅y) mod 2wx∗wuy=(x⋅y) mod 2w

有符号数补码乘法

x∗twy=U2Tw((x⋅y) mod 2w)x∗wty=U2Tw((x⋅y) mod 2w)

乘以常数

B2Uw+k([xw−1,xw−2,...,x0,0,...,0])=∑i=0w−1xi2i+k=[∑i=0w−1xi2i]⋅2k=x⋅2kB2Uw+k([xw−1,xw−2,...,x0,0,...,0])=∑i=0w−1xi2i+k=[∑i=0w−1xi2i]⋅2k=x⋅2k

对于某个常数KK的表达式x∗Kx∗K生成代码,编译器会将KK的二进制表示为一组0和1交替的序列[(0...0)(1...1)(0...0)(1...1)][(0...0)(1...1)(0...0)(1...1)]

考虑一组从位位置nn到位置mm的连续的1(n≥mn≥m),有两种形式来计算

(x<<n)+(x<<n−1)+…+(x<<m)(x<<n)+(x<<n−1)+…+(x<<m)

(x<<n+1)−(x<<m)(x<<n+1)−(x<<m),当nn为最高有效位−(x<<m)−(x<<m)

除以2的幂

无符号数除以2的幂

B2Uw−k([xw−k−1,xw−k−2,...,x0])=∑i=0w−k−1xi2i=[∑i=kw−1xi2i]/2k=x/2kB2Uw−k([xw−k−1,xw−k−2,...,x0])=∑i=0w−k−1xi2i=[∑i=kw−1xi2i]/2k=x/2k

有符号数补码除以2的幂

B2Tw−k(T2Bw(x)/T2Bw(2k))=∑i=0w−k−1xi2i+(2k−1)/2k=[∑i=kw−1xi2i]/2k+(2k−1)/2k=(x+2k−1)/2kB2Tw−k(T2Bw(x)/T2Bw(2k))=∑i=0w−k−1xi2i+(2k−1)/2k=[∑i=kw−1xi2i]/2k+(2k−1)/2k=(x+2k−1)/2k

浮点数

二进制小数

形如bmbm−1bm−2...b1b0.b−1b−2...b−n+1b−nbmbm−1bm−2...b1b0.b−1b−2...b−n+1b−n的表示法,其中每个二进制数字或者位,bibi的取值范围是0和1,则

b=∑i=−nmbi2ib=∑i=−nmbi2i

符号
.
变为了二进制的点,点左边的位的权是2的非负幂,右边是负幂

小数的二进制表示法只能表示那些能够被写成x×2yx×2y的数,其它值职能被近似

IEEE浮点表示

使用V=(−1)s×M×2EV=(−1)s×M×2E的形式表示一个数

符号ss决定这个数是负数(1)还是整数(0)

阶码EE的作用是对浮点数加权,权重是2的EE次幂

尾数MM是一个二进制小数,范围是1∼2−ϵ1∼2−ϵ,或者0∼1−ϵ0∼1−ϵ

将浮点数的位表示划分为三个字段,分别编码

1位的符号位ss编码符号ss

kk位的阶码字段exp=ek−1...e1e0exp=ek−1...e1e0编码阶码EE

nn位的小数字段frac=fn−1...f1f0frac=fn−1...f1f0编码尾数MM

值的表示

规格化的值

sexpfrac
s非0 && 非全1frac
阶码E=exp−BiasE=exp−Bias,其中expexp是无符号数,位表示为exp=ek−1...e1e0exp=ek−1...e1e0,偏置值Bias=2k−1−1Bias=2k−1−1

小数字段fracfrac解释为描述小数值ff,其中0≤f<10≤f<1,其二进制表示为0.fn−1fn−2...f1f00.fn−1fn−2...f1f0,尾数M=1+fM=1+f,这种方式叫做隐含以1开头的表示,MM的二进制表示为1.fn−1fn−2...f1f01.fn−1fn−2...f1f0

非规格化的值

sexpfrac
s0frac
阶码值E=1−BiasE=1−Bias

尾数M=fM=f

提供了一种表示0的方法。+0.0的浮点表示的位模式为全0,-0.0的服点表示为符号位为1,其它为0

可以表示非常接近于0.0的数,并且是均匀接近于0.0,叫做逐渐溢出

特殊值

无穷大

sexpfrac
s全10
阶码值EE全为1

尾数MM全为0

符号ss为0的时候表示+∞+∞,符号ss为1的时候表示−∞−∞

能够表示溢出

NaN

sexpfrac
s全1非0
阶码值EE全为1

尾数MM非0

不是一个数

标准浮点格式

单精度(32=1+8+23)

sexpfrac
(31:31)(30:23)(22:0)
- 双精度(64=1+11+52)

sexpfrac
(63:63)(62:52)(51:0)

舍入

向偶数舍入

四舍六入五成双

向零舍入

向下舍入

向上舍入

浮点运算

浮点加法

可交换

x+fy=y+fxx+fy=y+fx

大多浮点数有加法的逆元,无穷和NaN是例外

不可结合

单调性

a≥b→x+a≥x+ba≥b→x+a≥x+b

浮点乘法

可交换

单位元为1.0

不可结合

不可分配

单调性

a≥b and c≥0→x∗fa≥x∗fba≥b and c≤0→x∗fa≤x∗fba≠NaN→a∗fa≥0(1)(2)(3)(1)a≥b and c≥0→x∗fa≥x∗fb(2)a≥b and c≤0→x∗fa≤x∗fb(3)a≠NaN→a∗fa≥0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: