数值的表示方法
日常生活中我们无时无刻不在接受来自外界的信息,并且传达着我们自己的信息,而承载这些信息的就是数据。 在计算机的世界中,所有数据都是用二进制来表示的。
Overflow always exists in computing world !
二进制表示法
二进制是一种计数系统,二进制的表示与十进制的表示并无差异,如果我们用 8 bit 来表示一个二进制的正数 00000010,其真实的存储位值也是 00000010,那怎么来表示一个负数呢?
负数表示法
计算机的资源是有限的,所以并不能无限的表示一个数值,那么数值的表示必然会有一个区间。 在 32 位计算机上,4 字节的有符号数值范围在 -2^31 到 2^31 - 1,无符号数值的数值范围在 0 到 2^32 - 1。
那我们看下计算机是如何按位表示这些数值的。
1 被记成了 0000 0000 0000 0001,而 -1 被表示成了 1111 1111 1111 1111。
这里负数实际上是一种补码表示,比如我们约定数的表示范围是 0-9,分别对应数值 0,1,2,3,4,-5,-4,-3,-2,-1。
4 + (-5) = -1,对应表示是 4 + 5 = 9,等式依然成立,这种负数表示法我们也称为十进制补码。
如果计算一个数的负数,我们可以采用公式表示:-Value = 10^k - Value(k 是数字的个数)
比如上面 -1 = 10^1 - 1 = 9, -5 = 10^1 -5 = 5。同样的在二进制中这样的补码表示依然成立。
二进制补码
在上面的例子中我们已经看到了二进制补码的表示,-1 = 1111 1111 1111 1111,怎么获得补码表示,我们一般可以通过负数对应的正数获取反码,然后加 1 获得补码。
如 1 = 0000 0000 0000 0001,~1 = 1111 1111 1110,-1 = ~1 + 1 = 1111 1111 1111 1111。
简单的公式表示:-I = ~I + I 。
实数表示法
实数表示法我们针对小数来说明。
小数的表示一般有浮点表示法和科学计数法。
浮点表示法
二进制的浮点表示和十进制的类似,如十进制的 1.23 可以表示成 123 * 10^(-2),同样二进制的 1.01 可以表示成 101 * 2^(-2)
- 在32位存储浮点数值时,由 符号(1位) + 指数(8位) + 数值(23位) 组成,就是浮点表示法的形式;
- 在64位存储浮点数值是,由 符号(1位) + 指数(11位) + 数值(52位) 组成;
指数位也是有符号的,比如32位的实际指数范围是 -128 到 127。
怎么将十进制小数转换为二进制小数
十进制小数转换为二进制小数实际上与整数的转换相同。
十进制1.25转换为二进制小数, 1 + 0.25,非小数部分 1 转为二进制 1,小数部分 0.25 同样通过辗转相除得到二进制小数,但是余数是非小数部分,0.25 / 2^(-1) = 0.5...0; 0.5 / 2^(-1) = 1.0 = 0 ...1,那么1.25表示成二进制就是 1.01
科学计数法
这是我们熟悉的一种计数方法,123 我们记作 1.23E+2,0.001我们记作 1E-3。
(由于早期机器不能输出指数,而是用字母 'E' 作为替代)
来源:oschina
链接:https://my.oschina.net/u/3403644/blog/4454372