没有合适的资源?快使用搜索试试~ 我知道了~
负数在计算机中是怎么存储.pdf
资源推荐
资源详情
资源评论
负数在计算机中是怎么存储负数在计算机中是怎么存储
今天,发⽣⼀件⾮常有趣的事情。
公司同事问了我⼀个问题:为什么 2.0 - 1.1 = 0.89999999 呢?不应该是 0.9吗?
原来是,他问了周围⼀圈的同事,都给他的是同⼀个回答,说这是精度问题。他百思不得其解,怎么就会产⽣精度问题呢。再问,就没⼈知
道原因了。
然后,我就看到了他抱着⼀本厚厚的书在看。拿过来⼀看,是⼀本Java书,厚厚的六百多页,这还仅是第⼀卷。哟呵,这是准备⼤⼲⼀场
啊。
看在他这么努⼒学习的份上,还有他那对知识极度渴望的眼神。我决定,把我毕⽣所学传授与他。
于是,就给他详细讲解了,计算机中是怎么存储⼀个数的,⼗进制是怎么在转⼆进制的过程中丢失精度的,以及浮点数是怎么遵循IEEE 754
规范的,在浮点数进⾏加减运算的过程中会经历对阶、移位运算等过程,以及在此过程中是怎么丢失精度的。(这些问题在之前的⽂章中都
有解答,参看“为什么0.1+0.2=0.30000000000000004”)
然后,成功的把他彻底搞懵逼了。怎么这么难啊。
原来,他的计算机基础⽐我还匮乏,不知道什么是位运算,不知道什么是原码、反码和补码。
本着我的热⼼肠,我就给他普及了⼀下这些知识 ---- 负数的补码形式和位移运算。
我们知道,⼀个数分为有符号和⽆符号。对于,有符号的数来说,最⾼位代表符号位,即最⾼位1代表负数,0代表正数。
在计算机中,存储⼀个数的时候,都是以补码的形式存储的。⽽正数和负数的补码表⽰⽅式是不⼀样的。正数的补码就等于它的原码,⽽负
数的补码是原码除符号位以外都取反,然后 + 1 得来的。以⼀个int类型为例(4个字节即32位)
14的原码为:
0000 0000 0000 0000 0000 0000 0000 1110
它的反码、补码和原码都是⼀样的。
-14的原码为:
//最⾼位1为符号位,代表此数为负数
1000 0000 0000 0000 0000 0000 0000 1110
反码为原码除了符号位以外的其他位都取反(即0变为1,1变为0),
1111 1111 1111 1111 1111 1111 1111 0001
补码为反码 + 1 ,注意⼆进制中是满⼆进⼀。
1111 1111 1111 1111 1111 1111 1111 0010
位的左移,右移运算就是分别向左和向右移动N位。移位的规则是:
1. 不管有没有符号位,左移都是在低位补0
2. 带符号右移,是在⾼位补符号位,即正数补0,负数补1
3. ⽆符号右移,⽆论该数是正数还是负数都在⾼位补0
因左移就在右边低位补0就可以了,⽐较简单,我就以负数的右移来举例,是怎么计算⽆符号右移和带符号右移的。还是以 -14 为例。
// -14的补码
1111 1111 1111 1111 1111 1111 1111 0010
// 带符号右移⽤ >> 表⽰,即右移⼀位 -14>>1,⾼位补符号位1,低位舍去
1111 1111 1111 1111 1111 1111 1111 1001
// ⽆符号右移⽤ >>> 表⽰,即右移⼀位 -14>>>1,最⾼位补0
0111 1111 1111 1111 1111 1111 1111 1001
我们可以通过程序来验证⼀下 -14>>1和 -14>>>1的结果是否正确。
1. -14>>1 = -7
//我们算出来 -14>>1的补码为:
1111 1111 1111 1111 1111 1111 1111 1001
//那它具体代表的数值是多少呢?
//⾸先,补码 -1 得到反码
1111 1111 1111 1111 1111 1111 1111 1000
//然后,反码取反得到原码,最⾼位符号位不变
1000 0000 0000 0000 0000 0000 0000 0111
这结果不就是 -7 吗,然后通过程序计算⼀下结果:
资源评论
是空空呀
- 粉丝: 171
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功