这种用二进制来表示十进制的编码方式,叫作BCD 编码(Binary-Coded Decimal)。
规格化浮点数:
浮点数的不精确性:
>>> 0.3 + 0.6
0.8999999999999999
浮点数的加法和精度损失:
其中指数位较小的数,需要将有效位进行右移(小数点不动,数右移),在右移的过程中,最右侧的有效位就可能被丢弃掉。这会导致对应的指数位较小的数,在加法发生之前,就丢失精度。两个相加数的指数位差的越大,位移的位数越大,可能丢失的精度也就越大。
加法运算:
减法运算:
乘法运算:
除法运算:
符号数的表示方法:
原码:最高位为符号位,其余为真值部分。符号位+【绝对值】
0的原码表示不唯一:
反码:正数的反码与原码相同,负数的反码则是在原码的基础上符号位不变,数值部分按位取反。
X = -52 = -011 0100
[X]原 = 10110100
[X]反 = 11001011
0的反码也不是唯一的:
[+0]反 = [+0]原 = 0000 0000
[-0]原 = 1000 0000
[-0]反 = 1111
1111
补码:若 X > 0,则[X]补 = [X]反 = [X]原;若X < 0,则[X]补 = [X]反+1。
X = -52 = -011 0100
[X]原 = 10110100
[X]反 = 11001011
[X]补 = [X]反 + 1 = 1100 1100
[X]原 也等于 [[X]补]补
0的补码:
[+0]补 = [+0]原 = 0000 0000
[-0]补 = [-0]反+1 = 1111 1111 + 1 = 10000 0000
对于8位有效字长,进位 (第9位) 被舍掉,我们看到的就是8个0,这样一来,就和+0的补码一样了。
所以,补码解决了 0 的表示不唯一的问题。
除此之外,补码也实现了将减法运算转换为加法运算。
注:我们在实际编程时,负数可用“-”表示。由编译系统将其转换为补码。
例如:-3 编译后的值为 FDH,1111 1101B就是-3的补码。
补码的算术运算:
对于无符号数:
在原码中的定义为:
在反码中的定义为:
在补码中的定义为:
计算机能够表示的数是有限的,例如你的计算机是64位,一次最多只能处理64位长的数据。当运算结果超出了计算机所能表示的范围的时候(例如64位机),就会产生溢出。
无符号数的表示范围:
无符号数加减运算溢出的判断方法:
注:n表示字长
原码和反码:
补码:
对于8位2进制数:
有符号数加减运算溢出的判断方法:
因为无符号数和有符号数的表示范围不一样,所以判断是否溢出的方法也不一样。
对于有符号数, 判断是否溢出,要用双位。
乘法运算不存在溢出问题, 而除法运算溢出时, 会产生 “除数为0” 中断.
注: 计算机中的符号数默认以补码形式表示。
只有原码的数值部分是真值。
反码和补码的数值部分都不是真值。