1. 整数时, 二进制与十进制可准确转换, 小数时与二进制转换起来情况就复杂了, 二进制不能准确表示某些十进制的小数.

2. 整数, 二进制与十进制转换. 整数转换规则: 除2, 得商和余数, 商除2得商和余数, 直到商为0.

以125为例, 十进制转换为二进制.

余数
125/2 62 1
62/2 31 0
31/2 15 1
15/2 7 1
7/2 3 1
3/2 1 1
1/2 0 1

由个位数向前除得最高位数.

125=1x2^0 + 0x2^1 + 1x2^2 + 1x2^3 + 1x2^4 + 1x2^5 + 1x2^6得到二进制数1111101

3. 有小数, 十里与十进制转换. 小数转换规则: 乘2, 如有整数, 去除整数, 小数再乘以2, 直到小数部分为0或小数部分与原始小数部分相等为止.

补充下以float为例, 8B即32b, 从左到右, 1b符号位S(Sign), 8b指数位E(Exponent), 23b尾数位(或称系数位Significand)

float, 首位是1, 默认不存储, 提高一位精度, 节省空间, 实际截取尾数对应着二进制中第2-24位, 从第25位开始舍弃, 如果25位是1时24位+1, 0则直接舍弃.

特殊情况上一步24位+1后, 进位溢出即(出现类似1.11 1111 1111 1111 1111 1111 1 111情况, 10.00 0000 0000 0000 0000 0), 则需要向右移, 舍弃当前24位1.00 0000 0000 0000 0000 0, 同时指数E+1

例一. 0.75的二进制.

整数部分 小数部分
0.75*2 1 0.5
05*2 1 0
IEEE754表示法(+0.75)10 = .11 = 1.1 x 2^-1. (0.75括号外的10在右下角)

符号位部分0(正数)
指数位计算, E-127=-1, 帮E就是126, 0111 1110
尾数位计算, 110 0000 0000 0000 0000 0000, 去除第1位的1, 100 0000 0000 0000 0000 0000

0.75浮点数在内存中表示0 0111 1110 100 0000 0000 0000 0000 0000, 再整理下得到0011 1111 0100 0000 0000 0000 0000 0000

例二. 3.2的二进制.

整数3部分
余数
3/2 1 1
1/2 0 1
小数0.2部分
整数部分 小数部分
0.2*2 0 0.4
0.4*2 0 0.8
0.8*2 1 0.6
0.6*2 1 0.2
3.2 二进制11.0011, 二进制计算 1x2^1 + 1x2^0 + 0x2^-1 + 0x2^-2 + 1x2^-3 + 1x2^-4 = 3.1875并不是3.2.
实际在11.0011后, 循环11.001100110011…直到用完所有指数
3.2 = 1.100110011… * 2^1
符号位计算0(正数)

指数位计算, E-127=1, E=128, 1000 0000

尾数位计算, 110 0110 0110 0110 0110 0110 0110 0110 01
去除第1位的1, 第24位是0, 第25位是1,故应 100 1100 1100 1100 1100 1101

3.2浮点在内存表示, 0 1000 0000 100 1100 1100 1100 1100 1100, 再整理下, 0100 0000 0100 1100 1100 1100 1100 1100.
计算1.100 1100 1100 1100 1100 1101 = 3+2^-3+2^-4+2^-7+2^-8+2^-11+2^-12+2^-15+2^-16+2^-19+2^-20+2^-22 = 3.200000048

看!浮点是不准确的01.