整数的二进制存储,原码与补码,小数的存储

数的存储,也是一个常见的点,那么在计算机中如何表示数呢?答案是二进制!

表示

比如我们有一个数 5,那么二进制表示是101,这好办,但是如果是-5呢?

这就需要有一个符号位,单独地表示数字的正负,符号位被认为地规定在最高位,比如8位有符号整数,那么最高的第八位单独用来表示正负,那么 -5 就可以变成10000101了,这是好的

可是这又引申出另一问题:如何计算不同符号的数字加减法?

第一思路是想直接竖式加法,可是要知道,减法会对应着借位,cpu对于借位的认知,尚不及小学生

数字存储在寄存器里,而对两个寄存器进行借位的麻烦程度,大概只能用悲剧来形容!

既然每个数相差都是1,而且不同符号的同一个数字,相加之后要等于0,有没有一种操作,对数字做一定的变换,能够在满足上述两个情况呢?

补码

出于对加减法运算的迫切,我们需要一种新的存储方式!

定义:

  • 正数的补码是它本身
  • 负数的补码是【它表示的这个数字的绝对值的二进制表示】(原码)全部取反(符号位也要取反),再+1

通过补码的变换,我们惊奇的发现这样一个便利而快手的性质:可以直接加减了,而且加减之后的结果,是相当正确的(不考虑溢出

补码表:
在这里插入图片描述

值得注意的是

  1. 使用n位(bit)来表示有符号的整数,范围是[ -2n-1 ~ 2n-1 -1 ]
  2. 对于负数,其绝对值的原码转补码,或是反过来,补码转绝对值的原码,操作都是【全部取反再+1】

小数

上帝说:“ 兄啊,如果遇到不是整数的情况怎么办?”

于是计算机也可以存储小数了。小数分为定点和浮点,定点的好理解,就是小数点的位置固定

可是固定的小数点,play起来是及其不便的,虽然你会说“我无所谓!”,但是如果遇到非常巨大的数据,恐怕会溢出罢(悲),而且也会造成空间的浪费,(早期的jsj空间非常少,不像现在内存都是按GByte来算的)

那么就有了浮点,即小数点位置可变,参考十进制的科学计数法,比如 11.4514,我们将一个小数抽象为:0.114514 * 102

再抽象一点就是:(十进制下表示)

符号 * 尾数 * 基数的几次方
-1 * 0.114514 * 10^2 = -11.4514

其中尾数我们归一化到 -1 ~ 1 之间,而且只存储0后面的部分,实际缩放倍数,用单独的一串来存放,即 上图中的【10的几次方】

换做寄存器中的存储,就是【符号 + 基数的几次方 + 尾数】

在这里插入图片描述

发布了238 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44176696/article/details/104798319