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

无符号数

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

二进制转无符号数

B2Uw(x)i=0w1xi2i B 2 U w ( x → ) ≐ ∑ i = 0 w − 1 x i 2 i

有符号数

原码编码

B2Sw(x)(1)xw1i=0w2xi2i B 2 S w ( x → ) ≐ ( − 1 ) x w − 1 ∑ i = 0 w − 2 x i 2 i

反码编码

B2Ow(x)xw1(2w11)+i=0w2xi2i B 2 O w ( x → ) ≐ − x w − 1 ( 2 w − 1 − 1 ) + ∑ i = 0 w − 2 x i 2 i

补码编码

B2Tw(x)xw12w1+i=0w2xi2i B 2 T w ( x → ) ≐ − x w − 1 2 w − 1 + ∑ i = 0 w − 2 x i 2 i

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

B2Tw B 2 T w 是一个从长度为 w w 的位模式到TMinw TMaxw T M a x w 之间数字的映射,写做

B2Tw:{0,1}w{2w1,,2w11} B 2 T w : { 0 , 1 } w → { − 2 w − 1 , … , 2 w − 1 − 1 }

注意

  • |TMinw|=|TMaxw|+1 | T M i n w | = | T M a x w | + 1
  • UMaxw=2TMaxw+1 U M a x w = 2 T M a x w + 1

有符号数和无符号数转换

无符号数到补码

U2Tw(x)B2Tw(U2Bw(x))={uu2wu<2w1u2w1 U 2 T w ( x ) ≐ B 2 T w ( U 2 B w ( x ) ) = { u u < 2 w − 1 u − 2 w u ≥ 2 w − 1

补码到无符号数

T2Uw(x)B2Uw(T2Bw(x))={x+2wxx<0x0 T 2 U w ( x ) ≐ B 2 U w ( T 2 B w ( x ) ) = { x + 2 w x < 0 x x ≥ 0

扩展数位

零扩展

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

B2Uw+k([0,...,xw1,xw2,...,x0])=B2Uw([xw1,xw2,...,x0]) B 2 U w + k ( [ 0 , . . . , x w − 1 , x w − 2 , . . . , x 0 ] ) = B 2 U w ( [ x w − 1 , x w − 2 , . . . , x 0 ] )

符号扩展

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

B2Tw+k([xw1,...,xw1,xw2,...,x0])=B2Tw([xw1,xw2,...,x0]) B 2 T w + k ( [ x w − 1 , . . . , x w − 1 , x w − 2 , . . . , x 0 ] ) = B 2 T w ( [ x w − 1 , x w − 2 , . . . , x 0 ] )

截断数字

无符号数的截断结果

B2Uk([xk1,xk2,...,x0])=B2Uw([xw1,xw2,...,x0]) mod 2k B 2 U k ( [ x k − 1 , x k − 2 , . . . , x 0 ] ) = B 2 U w ( [ x w − 1 , x w − 2 , . . . , x 0 ] )   mod   2 k

有符号数补码的截断结果

B2Tk([xk1,xk2,...,x0])=U2Tw(B2Uw([xw1,xw2,...,x0]) mod 2k) B 2 T k ( [ x k − 1 , x k − 2 , . . . , x 0 ] ) = U 2 T w ( B 2 U w ( [ x w − 1 , x w − 2 , . . . , x 0 ] )   mod   2 k )


整数运算

无符号数加法

x+uwy={x+yx+y2wx+y<2w2wx+y<2w+1 x + w u y = { x + y x + y < 2 w x + y − 2 w 2 w ≤ x + y < 2 w + 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<2w1 x + w t y = U 2 T w ( T 2 U w ( x ) + w u T 2 U w ( y ) ) = U 2 T w [ ( x w − 1 2 w + x + y w − 1 2 w + y )   mod   2 w ] = U 2 T w [ ( x + y )   mod   2 w ] = { x + y − 2 w 2 w − 1 ≤ x + y 正 溢 出 x + y − 2 w − 1 ≤ x + y < 2 w − 1 正 常 x + y + 2 w x + y < − 2 w − 1 负 溢 出

有符号数补码的非

twx={2w1xx=2w1x>2w1 − w t x = { − 2 w − 1 x = − 2 w − 1 − x x > − 2 w − 1

无符号数乘法

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

有符号数补码乘法

xtwy=U2Tw((xy) mod 2w) x ∗ w t y = U 2 T w ( ( x ⋅ y )   mod   2 w )

乘以常数

B2Uw+k([xw1,xw2,...,x0,0,...,0])=i=0w1xi2i+k=[i=0w1xi2i]2k=x2k B 2 U w + k ( [ x w − 1 , x w − 2 , . . . , x 0 , 0 , . . . , 0 ] ) = ∑ i = 0 w − 1 x i 2 i + k = [ ∑ i = 0 w − 1 x i 2 i ] ⋅ 2 k = x ⋅ 2 k

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

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

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

除以2的幂

无符号数除以2的幂

B2Uwk([xwk1,xwk2,...,x0])=i=0wk1xi2i=[i=kw1xi2i]/2k=x/2k B 2 U w − k ( [ x w − k − 1 , x w − k − 2 , . . . , x 0 ] ) = ∑ i = 0 w − k − 1 x i 2 i = [ ∑ i = k w − 1 x i 2 i ] / 2 k = x / 2 k

有符号数补码除以2的幂

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


浮点数

二进制小数

形如 bmbm1bm2...b1b0.b1b2...bn+1bn b m b m − 1 b m − 2 . . . b 1 b 0 . b − 1 b − 2 . . . b − n + 1 b − n 的表示法,其中每个二进制数字或者位, bi b i 的取值范围是0和1,则

b=i=nmbi2i b = ∑ i = − n m b i 2 i

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

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

IEEE浮点表示

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

  • 符号 s s 决定这个数是负数(1)还是整数(0)
  • 阶码E的作用是对浮点数加权,权重是2的 E E 次幂
  • 尾数M是一个二进制小数,范围是 12ϵ 1 ∼ 2 − ϵ ,或者 01ϵ 0 ∼ 1 − ϵ

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

  • 1位的符号位 s s 编码符号s
  • k k 位的阶码字段exp=ek1...e1e0编码阶码 E E
  • n位的小数字段 frac=fn1...f1f0 f r a c = f n − 1 . . . f 1 f 0 编码尾数 M M

值的表示

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

阶码E=expBias,其中 exp e x p 是无符号数,位表示为 exp=ek1...e1e0 e x p = e k − 1 . . . e 1 e 0 ,偏置值 Bias=2k11 B i a s = 2 k − 1 − 1

小数字段 frac f r a c 解释为描述小数值 f f ,其中0f<1,其二进制表示为 0.fn1fn2...f1f0 0. f n − 1 f n − 2 . . . f 1 f 0 ,尾数 M1+f M = 1 + f ,这种方式叫做隐含以1开头的表示, M M 的二进制表示为1.fn1fn2...f1f0

  1. 非规格化的值
sexpfrac
s0frac

阶码值 E=1Bias E = 1 − B i a s

尾数 Mf M = f

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

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

  1. 特殊值

    1. 无穷大
    sexpfrac
    s全10

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

    能够表示溢出

    1. NaN
    sexpfrac
    s全1非0

    阶码值 E E 全为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+fx x + f y = y + f x

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

  • 不可结合

  • 单调性

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

浮点乘法

  • 可交换

  • 单位元为1.0

  • 不可结合

  • 不可分配

  • 单调性

    ab and c0xfaxfbab and c0xfaxfbaNaNafa0(1)(2)(3) (1) a ≥ b   and   c ≥ 0 → x ∗ f a ≥ x ∗ f b (2) a ≥ b   and   c ≤ 0 → x ∗ f a ≤ x ∗ f b (3) a ≠ N a N → a ∗ f a ≥ 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值