02信息的表示和处理

字节顺序

小端

最低有效字节在最前面

大多数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表示整个向量,或者写成[xw1,xw2,,x0][xw−1,xw−2,…,x0]表示向量中的每一位

二进制转无符号数

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

有符号数

原码编码

B2Sw(x)(1)xw1i=0w2xi2iB2Sw(x→)≐(−1)xw−1∑i=0w−2xi2i
反码编码

B2Ow(x)xw1(2w11)+i=0w2xi2iB2Ow(x→)≐−xw−1(2w−1−1)+∑i=0w−2xi2i
补码编码

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

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

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

B2Tw:{0,1}w{2w1,,2w11}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))={uu2wu<2w1u2w1U2Tw(x)≐B2Tw(U2Bw(x))={uu<2w−1u−2wu≥2w−1
补码到无符号数

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

扩展数位

零扩展

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

B2Uw+k([0,...,xw1,xw2,...,x0])=B2Uw([xw1,xw2,...,x0])B2Uw+k([0,...,xw−1,xw−2,...,x0])=B2Uw([xw−1,xw−2,...,x0])
符号扩展

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

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

截断数字

无符号数的截断结果

B2Uk([xk1,xk2,...,x0])=B2Uw([xw1,xw2,...,x0]) mod 2kB2Uk([xk−1,xk−2,...,x0])=B2Uw([xw−1,xw−2,...,x0]) mod 2k
有符号数补码的截断结果

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

整数运算

无符号数加法

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

有符号数补码加法

x+twy=U2Tw(T2Uw(x)+uwT2Uw(y))=U2Tw[(xw12w+x+yw12w+y) mod 2w]=U2Tw[(x+y) mod 2w]=x+y2wx+yx+y+2w2w1x+y2w1x+y<2w1x+y<2w1x+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={2w1xx=2w1x>2w1−wtx={−2w−1x=−2w−1−xx>−2w−1

无符号数乘法

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

有符号数补码乘法

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

乘以常数

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

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

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

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

除以2的幂

无符号数除以2的幂

B2Uwk([xwk1,xwk2,...,x0])=i=0wk1xi2i=[i=kw1xi2i]/2k=x/2kB2Uw−k([xw−k−1,xw−k−2,...,x0])=∑i=0w−k−1xi2i=[∑i=kw−1xi2i]/2k=x/2k
有符号数补码除以2的幂

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

浮点数

二进制小数

形如bmbm1bm2...b1b0.b1b2...bn+1bnbmbm−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)
  • 阶码E的作用是对浮点数加权,权重是2的EE次幂
  • 尾数M是一个二进制小数,范围是12ϵ1∼2−ϵ,或者01ϵ0∼1−ϵ

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

  • 1位的符号位ss编码符号s
  • kk位的阶码字段exp=ek1...e1e0编码阶码EE
  • n位的小数字段frac=fn1...f1f0frac=fn−1...f1f0编码尾数MM

值的表示

  1. 规格化的值
s exp frac
s 非0 && 非全1 frac

阶码E=expBias,其中expexp是无符号数,位表示为exp=ek1...e1e0exp=ek−1...e1e0,偏置值Bias=2k11Bias=2k−1−1

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

  1. 非规格化的值
sexpfrac
s0frac

阶码值E=1BiasE=1−Bias

尾数MfM=f

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

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

  1. 特殊值

    1. 无穷大
    sexpfrac
    s全10

    阶码值EE全为1
    尾数M全为0
    符号ss为0的时候表示+,符号ss为1的时候表示

    能够表示溢出

    1. NaN
    sexpfrac
    s全1非0

    阶码值EE全为1
    尾数M非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是例外

  • 不可结合

  • 单调性

    abx+ax+ba≥b→x+a≥x+b

浮点乘法

  • 可交换

  • 单位元为1.0

  • 不可结合

  • 不可分配

  • 单调性

    ab and c0xfaxfbab and c0xfaxfbaNaNafa0(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值