二进制之补码与小数

2021年6月6日 8点热度 0条评论 来源: 杨金牛

牛逼的二进制

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.说明

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

    原文作者:杨金牛
    原文地址: https://blog.csdn.net/weixin_50260670/article/details/117599739
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。