数字

在计算机中根据小数点位置是否固定,数字分为定点数和浮点数两种类型,整数属于定点数,它的小数点始终固定在最右边。浮点数,根据精度可以分为单精度浮点和双精度浮点数两种。

一、整数

整数分为无符号整数和有符号整数两种

1、无符号整数

无符号整数按其二进制的形式直接存储

2、有符号整数

有符号整数是在无符号整数的基础上在最左边加上符号位构成的

  • 符号位:对于有符号整数,它的最高位称为符号位,0代表整数,1代表负数。
  • 原码:符号位+无符号整数的二进制数据 = 原码,也就是说原码由符号位和无符号整数的二进制数据两部分组成。

然而在计算机中,为了加快运算速度,有符号整数并不是以原码的形式而存在的,在存储和读取时都需要进行转化。


转化流程
  • 反码:
    正数的反码等于原码
    负数的反码是在其原码的基础上,符号位不变,其余位置取反,即0变1,1变0
  • 补码:
    正数和负数的补码也不一样,也要区别对待。
    对于正数,它的补码就是其原码(原码、反码、补码都相同);负数的补码是其反码加 1。例如short a = 6;,a 的原码、反码、补码都是0000 0000 0000 0110;更改 a 的值a = -18;,此时 a 的补码是1111 1111 1110 1110。

可以认为,补码是在反码的基础上打了一个补丁,进行了一下修正,所以叫“补码”。
原码、反码、补码的概念只对负数有实际意义,对于正数,它们都一样,有了这几步转化,计算机减法统一为加法,并带符号直接运算,大大简化了硬件电路,不需要再区分正负符号,以及将加减统一为加。

二、浮点数

浮点数在计算机中以科学记数法的方式存在的,根据精度不同可分为32位的单精度浮点数,和64位的双精度浮点数。


浮点数
1、单精度浮点数:

单精度浮点数,共32bit占4个字节内存,由符号位、指数位、尾数三部分组成,下面结合8.5(100.1 |{1.001*2^2})具体说一下

  • 符号位:
    同整数的符号位相同,0正1负,占一个bit,对于8.5的符号位为0
  • 指数:
    指数部分占8bit,其值需要在原值的基础上加上{2^7-1},由此指数部分的最大值为127
    {2^7-1}转换位二进制为1111111
    对于8.5的指数位={2^7-1+3}=1111111+10=10000001
  • 尾数:
    尾数同科学记数法
    对于8.5的尾数为001 00000 00000 00000 00000

由此可依得出,单精度浮点数对应的{十进制值=符号位 * 1.尾数*2^{指数-1111111}}
对于8.5这个例子
{8.5 = 1*1.001 00000 00000 00000 00000*2^{10000001-1111111}}
简化一下得
{8.5 = 1*1.001 *2^{10} =1.001 *2^{2}}
去掉指数得
{8.5 = 100.1 }
同理亦可计算出单精度浮点数的极值,{极大值 = 1*1.11111 11111 11111 11111 111 *2^{127} =2 *2^{127 }=2^{128}=3.4*10^{38}}

2、双精度浮点数

双精度浮点数,转化原理同单精度没有区别只是位数,最大最小值的变化。

三、js中的Number

对于js,所有的number都是双精度浮点数。
对于浮点数的运算,存在精度丢失问题,因此js中也会如此,造成的原因就是小数部分转化为二进制,例如0.3,一只*2取整数,是取不尽的,故而知能取约数,因此产生恶劣精度丢失。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容