数制转换
二进制和十进制互相转换
原码反码补码
逻辑符号
编码
IEEE754浮点数
IEEE754是计算机表示浮点数的标准,核心思想是想把一个数拆出符号位、指数位、尾数位三部分存储。最常用的是32位单精度(float)和64位双精度(double)。
- 单精度(32位):1符号位+8位指数+23位尾数,指数偏移量为127.
- 双精度(64位):1符号位+11位指数+52位尾数,指数偏移量为1023.
举例说明
以单精度浮点数表示176.0625为例:
- 转换为二进制:10110000.0001
- 规格化:1.01100000001×2^7
- 符号位:0(正数)
- 指数编码:7 + 127 = 134 → 二进制10000110
- 尾数(隐藏前导1后):01100000001000000000000
最终存储为:0 10000110 01100000001000000000000
大致理解:阶码指数表示数的大小,全是1接近最大,全是0接近最小;尾数表示具体的值
关键规则
- 规约数(Normalized):尾数前隐藏一个默认的1.,实际公式为:(-1)^S × 1.M × 2^(E-偏移量)。例:二进制1.0101,只存小数点后面0101,开头的1不占用存储空间,节省一位。
- 非规约数(Subnormal):指数位全0且尾数非0时,用于表示接近0的极小数值,此时尾数前不再隐藏1.,计算公式位:(-1)^S × 0.M × 2^(1-偏移量)。
- 特殊值:
指数全0、尾数全0 → ±0;指数全1、尾数全0→±∞;指数全1、尾数非0→NaN(非数值). - 有效数字不是小数点后的位数,是全部有效数字。float:23位尾数,换算十进制大约6~7位有效数字;double:52位尾数,大约15-16位有效数字。
数值变大之后,float尾部小数丢失精度。
注意:指数全0和全1都有特殊含义,不能当作普通指数使用;实际可用的指数范围单精度位-126到+127,双精度位-1022到+1023.
有效位数
二进制每增加1bit,能区分2倍大小;十进制每增加1位,能区分10倍大小。log102 ≈ 0.3010含义:1个二进制bit≈0.301位十进制有效数字。
- float:24bit × 0.301 ≈ 7.2位;
- double:53bit × 0.301 ≈ 16位。
阶码偏移(移码)
IEEE-754的阶码不直接存真实指数,要加上一个偏移量。
- float(32位):偏移量 = 127
- double(64位):偏移量 = 1023
特殊规则:阶码两种边界情况
- 阶码全部比特为1
- 尾数全0:无穷大(inf)
- 尾数非0:非数字(NaN,无效计算结果,比如0除以0)
- 阶码全部比特为0
- 代表非规格化数,用来表示接近0的极小数字;此时不再隐藏开头的1.
正常使用的普通浮点数,阶码既不全0,也不全1.