在计算机中根据小数点位置是否固定,数字分为定点数和浮点数两种类型,整数属于定点数,它的小数点始终固定在最右边。浮点数,根据精度可以分为单精度浮点和双精度浮点数两种。
一、整数
整数分为无符号整数和有符号整数两种
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 |)具体说一下
- 符号位:
同整数的符号位相同,0正1负,占一个bit,对于8.5的符号位为0 - 指数:
指数部分占8bit,其值需要在原值的基础上加上,由此指数部分的最大值为127
转换位二进制为1111111
对于8.5的指数位==1111111+10=10000001 - 尾数:
尾数同科学记数法
对于8.5的尾数为001 00000 00000 00000 00000
由此可依得出,单精度浮点数对应的
对于8.5这个例子
简化一下得
去掉指数得
同理亦可计算出单精度浮点数的极值,
2、双精度浮点数
双精度浮点数,转化原理同单精度没有区别只是位数,最大最小值的变化。
三、js中的Number
对于js,所有的number都是双精度浮点数。
对于浮点数的运算,存在精度丢失问题,因此js中也会如此,造成的原因就是小数部分转化为二进制,例如0.3,一只*2取整数,是取不尽的,故而知能取约数,因此产生恶劣精度丢失。