2字节取值范围_第二篇——整数和浮点数在计算机中的表示(2)

6b98fe9d3408e5180f2fab61c2957fca.png

下面,我们描述一下用位来编码整数的两种不同方式:一种只能表示非负数,而另一种能表示负数、正数和零。

1、无符号数的编码

原理:无符号数编码的定义

对向量

函数

将一个长度为w的0,1串映射到一个非负整数。看示例:

B2U( [0001] ) = 0*2^3 + 0*2^2 + 0*2^1 + 1*2^0 = 1

B2U( [0101] ) = 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 5

B2U( [1111] ) = 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = 15

这种编码方式最大值用单位向量[11...11]表示,也就是

,最小值用单位向量[00...00]表示,也就是整数

e44ce65001ff7bd92ee3703811811050.png
表示范围

原理:无符号数编码的唯一性,函数

是一个双射

函数

将每个长度为w的位向量映射为
之间的唯一值。反过来,
之间的每一个整数映射为一个唯一的长度为w的位模式。

2、补码编码

补码可以表示有符号数,补码的定义是将最高有效位解释为负权,用

表示。

原理:补码编码的定义

对向量

最高有效位

也被称为符合位,它的权重为
当符合位为1时,表示值为负,0表示非负,看示例:

B2T( [0001] ) = ﹣0*2^3 + 0*2^2 + 0*2^1 + 1*2^0 = 1

B2T( [0101] ) =﹣0*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 5

B2T( [1011] ) = ﹣1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = ﹣5

B2T( [1111] ) = ﹣1*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = ﹣1

所以w位补码能表示的最大值为

,最大值为
,同无符号表示一样,在可表示的取值范围内的每个数字都有一个唯一的w位的补码编码,从而得到补码数原理,

原理:补码编码的唯一性,函数

是一个双射,
的反函数

3f9009af6aab6ae3f686adb7d8580513.png

关于整数数据类型的取值范围和表示,Java标准非常明确,要求用补码表示,单字节数据类型称为byte,而不是char,这些要求是为了保证无论在什么机器上运行,Java程序都能表现的完全一样。有符号数还有两种标准的表示方法——反码和原码

反码:除了最高有效位的权是

外,其他和补码一样

原码:最高有效位是符号位,

对于数字0,两种编码都把[00...00]解释为+0,但是值-0在原码中表示为[10...00],在反码中表示为[11...11]。几乎所有现代机器都使用补码。

3、有符号和无符号数之间的转换

考虑如下代码:
short int v = -12345;
unsigned short uv = (unsigned short) v;
printf("v = %d, uv = %un", v, uv);

在一台采用补码的机器中,上述代码的输出为:
v = -12345,uv = 53191

而-12345的16位二进制表示为:[1100111111000111],53191的二进制位表示也是[1100111111000111],这说明强制类型转换的结果是保持位值不变,只改变了解释这些位的方式。

原理:补码转换为无符号数

对满足

的 x 有:

比如,

22d4a3da5e11d41e24782aa18272bf3f.png

04e87f18ebe499bda5c1595e9e8f9b61.png

004ea6d4a1596b856cd0252f7c1b00d0.png

原理:无符号数转化为补码

对满足

的 u 有:

总结:从公式可以看出,对于范围在

之间的值 x ,
,也就是说在这个范围内有相同的无符号和补码表示,对于这个范围以外的数值需要加上或减去

符号位扩展

bb60e4a68a9d71a9b6954a547a1c09cf.png
MSB:最高有效位

bb55d4d0f4b668217fe2bf058db86020.png

截断

255aa2595e20f1cf9b8b171c65aad316.png

ae1280b492297b9157a9a3f828c2301a.png

无符号加法运算

28cf8ab49909026d6b73608c044d4166.png

4408b8d32ba40bc2c7cc1d47e4bc1fa8.png

补码的加法运算

dadcd7b581fe1da6d6e04b9be6fd83fd.png
此图示例可以联系符号位扩展加以理解

e2b9eba61bc28df8a0b66d321c692454.png

1fd1af704b5025ce2ecfe84f9655796f.png

无符号乘法

1caae0222cf2dce68e2164080bd15f5b.png

有符合乘法

64777ee7eac4d8a0ae4dfafbe8deaa25.png

浮点数表示

根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:

7b62d6ec061d813314d2a476e2234d02.png

 (1)符号:(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。

 (2)尾数:M表示有效数字,大于等于1,小于2。

 (3)阶码:2^E表示指数位。

61b1d1024393eff3f01f9c12c7ee067d.png

例如:十进制的6.0,写成二进制是110.0,相当于1.10×2^2。那么,按照上面V的格式,可以得出s=0,M=1.10,E=2。

十进制的-5.0,写成二进制是-101.0,相当于-1.01×2^2。那么,s=1,M=1.01,E=2。

(祖传结尾)

感谢作者Randal E. Bryant和David R. O'Hallaron

如有错漏之处望指出,推荐亲自阅读《深入理解计算机系统》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值