二进制之补码与小数

牛逼的二进制

1.前言

计算机使用二进制来表示所有形式的数据:颜色、文字、图像等。当前辈们想方设法要造一台计算机时都会遇到一个问题:怎么用电来表示数? 显然他们发现开关的开和关正好对应二进制的0和1,然后计算机就使用二进制直到如今。

那计算机怎么使用二进制表示负数呢?怎么表示小数?怎么进行运算呢?

2.用二进制表示负数

由于二进制不能表示负数,所以必须使用正数来表示负数,将最高位当符号位使用,0正1负,这样就可以使用加法来进行减法运算。

而补数就是用正数表示负数,一个正数的补数就是它的负数,所以二进制数与它的补数相加结果必为0。

获得补数的方法是将二进制数取反加一。

注意:运算结果是负数时,也是用补码来表示。将其返回到源码再在前面加负号就是运算结果。

3.用二进制进行乘法和除法

二进制进行乘除是使用移位运算,将二进制数总体进行左移或右移。

  • 左移:移动后空出来的最低位补0:
    在这里插入图片描述

  • 右移分为逻辑右移和算数右移,逻辑右移移动后空出来的最高位补0,例如霓虹灯;算术右移移动后空来的最高位补移位之前符号位的值。
    在这里插入图片描述
    此外,移位后最高位和最低位多出的数字直接丢弃。左移就是乘2的倍数,右移就是除以2的倍数。

4.符号扩充

以8位的二进制数为例,符号扩充指在保持值不变的前提下,使用16或32位来表示这个进制数,方法很简单,只需要用符号位的值填充最高位。
在这里插入图片描述
5.用二进制数表示小数

先来看两个问题:

1.将二进制数1011.0011转换成十进制:
在这里插入图片描述
2.小数点后四位的二进制可以表示的十进制有哪些:
在这里插入图片描述
由图可知二进制数是连续的,十进制不连续,中间的十进制数都无法用二进制表示。比如十进制的0.1转換成二进制是一个循环小数,计算机遇到这种循环小数时会根据数据类型进行截断或者四含五入。例如float会保存小数点后六位。这也是计算机进行小数运算时容易出错的原因,可以使用整数代替小数运算再复原的方法来解决这个问题。

6.小数的存储方式:浮点数

浮点数指用符号、位数、基数和指数来表示小数。由于计算机使用二进制,基数固定为2。
在这里插入图片描述
浮点数在内存上是这样存储的:
在这里插入图片描述
尾数部分使用正则表达式表示,指数部分使用“EXCESS”系统表示。

1)正则表达式

二进制数中使用的是将小数点前的值固定为1的正则表达式。就是将小数点左移或右移,使得左边有且只有一个1。由于第一位肯定是1,在内存上就可以不存,节省了一个数据位。

2)“ EXCESS”系统

因为指数部分也可能是负数,为了不使用符号位,前辈们创造出 “EXCESS”系统。通过将指数部分表示范围的中间值设为0,用正数表示负数。比如八位二进制最大值为255,即用127表示0,126就为-1,128为1。

7.说明

本文为《程序是怎样跑起来的》读书笔记,如有错误,请兄弟们指正,大家一起进步!

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值