![6b98fe9d3408e5180f2fab61c2957fca.png](https://i-blog.csdnimg.cn/blog_migrate/b4ddeb172759a76d3cf0c178c742b59c.jpeg)
下面,我们描述一下用位来编码整数的两种不同方式:一种只能表示非负数,而另一种能表示负数、正数和零。
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]表示,也就是
![e44ce65001ff7bd92ee3703811811050.png](https://i-blog.csdnimg.cn/blog_migrate/95dbb92b398de6ffda1e9aab1648c5a9.jpeg)
原理:无符号数编码的唯一性,函数
函数
2、补码编码
补码可以表示有符号数,补码的定义是将最高有效位解释为负权,用
原理:补码编码的定义
对向量
最高有效位
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位补码能表示的最大值为
原理:补码编码的唯一性,函数
![3f9009af6aab6ae3f686adb7d8580513.png](https://i-blog.csdnimg.cn/blog_migrate/c368bbd4aaa06a78d9f3f322974ec303.jpeg)
关于整数数据类型的取值范围和表示,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],这说明强制类型转换的结果是保持位值不变,只改变了解释这些位的方式。
原理:补码转换为无符号数
对满足
比如,
![22d4a3da5e11d41e24782aa18272bf3f.png](https://i-blog.csdnimg.cn/blog_migrate/75c1925c82baadadef640a7a67670646.jpeg)
![04e87f18ebe499bda5c1595e9e8f9b61.png](https://i-blog.csdnimg.cn/blog_migrate/22d684385bdbfa86e058671acaefe5a8.jpeg)
![004ea6d4a1596b856cd0252f7c1b00d0.png](https://i-blog.csdnimg.cn/blog_migrate/17ac2e5c599ab65969f64fadd07afb7a.jpeg)
原理:无符号数转化为补码
对满足
总结:从公式可以看出,对于范围在
符号位扩展
![bb60e4a68a9d71a9b6954a547a1c09cf.png](https://i-blog.csdnimg.cn/blog_migrate/07a6b3af6d83960ca723598e571f7833.jpeg)
![bb55d4d0f4b668217fe2bf058db86020.png](https://i-blog.csdnimg.cn/blog_migrate/9c7f6edac5d365d337b6e37340d3c5bb.jpeg)
截断
![255aa2595e20f1cf9b8b171c65aad316.png](https://i-blog.csdnimg.cn/blog_migrate/fcacd784059cfec30f333cb82add1cd8.jpeg)
![ae1280b492297b9157a9a3f828c2301a.png](https://i-blog.csdnimg.cn/blog_migrate/3c88b421c43fa3eea39b9cb00aa7b38c.jpeg)
无符号加法运算
![28cf8ab49909026d6b73608c044d4166.png](https://i-blog.csdnimg.cn/blog_migrate/6616158d19a26b9a55edbb6adf945c5f.jpeg)
![4408b8d32ba40bc2c7cc1d47e4bc1fa8.png](https://i-blog.csdnimg.cn/blog_migrate/cdb691bbfca117f5b74e805df92f5ee5.jpeg)
补码的加法运算
![dadcd7b581fe1da6d6e04b9be6fd83fd.png](https://i-blog.csdnimg.cn/blog_migrate/219ef76c6d6de81b958a4b71a6b2692c.jpeg)
![e2b9eba61bc28df8a0b66d321c692454.png](https://i-blog.csdnimg.cn/blog_migrate/217c2608855fa4adaa17eead7ac608ce.jpeg)
![1fd1af704b5025ce2ecfe84f9655796f.png](https://i-blog.csdnimg.cn/blog_migrate/f4a476213481931cc6d39fa577b829c3.jpeg)
无符号乘法
![1caae0222cf2dce68e2164080bd15f5b.png](https://i-blog.csdnimg.cn/blog_migrate/b7023089a2a993d9c102dc1d621c8c0d.jpeg)
有符合乘法
![64777ee7eac4d8a0ae4dfafbe8deaa25.png](https://i-blog.csdnimg.cn/blog_migrate/41f1edf3254bfd277538e3f29d6dd097.jpeg)
浮点数表示
根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:
![7b62d6ec061d813314d2a476e2234d02.png](https://i-blog.csdnimg.cn/blog_migrate/f4a0809b5c7626e0875f2a7d09ae6643.png)
(1)符号:(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
(2)尾数:M表示有效数字,大于等于1,小于2。
(3)阶码:2^E表示指数位。
![61b1d1024393eff3f01f9c12c7ee067d.png](https://i-blog.csdnimg.cn/blog_migrate/d3dd9d10537979693340a00971e49be8.jpeg)
例如:十进制的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
如有错漏之处望指出,推荐亲自阅读《深入理解计算机系统》