数据格式
定点数
- 定点数就是数据的小数点的位置是固定不变的,通常将数据表示成纯小数或纯整数
- 以 n + 1 n+1 n+1 位数表示定点数,以 X n Xn Xn表示定点数的正负(0 为正数,1表示负数)
- 对于 n + 1 n+1 n+1位定点数,小数点位于 X n Xn Xn 和 X n − 1 Xn-1 Xn−1之间,当每一个数位都是0时,绝对值最小为0,当全部数位为1时,绝对值最大为 1 − 2 − n 1- 2^{-n} 1−2−n
- 对于定点整数,表示的范围是 0 < = ∣ x ∣ < = 2 n − 1 0<= |x|<=2^n -1 0<=∣x∣<=2n−1
浮点数
- 计算机中,任意的二进制数N 可以写成: N = 2 e . M N=2^e.M N=2e.M
其中,M 是一个纯小数,称为尾数,e 是浮点数的指数,是一个整数,称为阶码
机器码表示
原码
- 通俗来说就是,符号位加上二进制的绝对值
- 对于0,有
+0
和-0
的两种表示方法- 缺点:加法运算复杂
反码
- 正数的反码与原码相同,负数的反码就是负数的原码符号位不变,数值位取反
补码
- 对于正数的补码就是原码
- 对于定点整数,负数的补码在计算上面可以由反码加1得到;但是从定义上看,我们用n+1 为数来表示一个定点整数,其中 X n Xn Xn为符号位,那么就有
[ x ] 补 = 2 n + 1 − ∣ x ∣ [x]补 = 2^{n+1} - |x| [x]补=2n+1−∣x∣ ,其实从实际意义上就是用正数多于的部分来表示负数- 采用补码的话,0的表示方法只有一种,并且无论数字为正数还是负数,机器总是做加法运算
数的补码与真值
- [ x ] 补 = X n X n − 1 X n − 2 . . . . X 1 X 0 [x]_补 =X_nX_{n-1}X_{n-2}....X_1X_0 [x]补=XnXn−1Xn−2....X1X0
对于上面的形式: x = − 2 n X n + ∑ i = 0 n − 1 2 i x i x = -2^n X_n+\sum_{i=0}^{n-1}2^ix^i x=−2nXn+∑i=0n−12ixi- 如何更好理解?
- 对于正数来说,由于符号位为0,那么就直接根据权重展开就可以
- 对于负数来说,由于符号位为1,那么就是包括符号位共n+1位的情况下,就用 − 2 n -2^n −2n去加上偏移量,就是后面的一堆的数字的权重即可,具体而言就是以一个时钟为例子:
一共由60份,本来是 [ 0 , 60 ] [0,60] [0,60],但是现在我用 [ 0 , 30 ] [0,30] [0,30]来表示正数, [ 30 , 60 [30,60 [30,60来表示原本的 [ − 30 , 0 ] [-30,0] [−30,0],并且-30 的位置与30 的位置重合,那么具体如何求回本身的负数呢?就是目前的位置逆时针转动一圈即可,就是-60
移码
- 移码通常表示浮点数的阶码,移码的定义为:
[ e ] 移 = 2 k + e [e]_移=2^k+e [e]移=2k+e, 2 k > e > = − 2 k 2^k>e>=-2^k 2k>e>=−2k
其中 [ x ] 移 [x]_移 [x]移 为机器码,e 表示真值, 2 k 2^k 2k是一个固定的偏移值常数
IEEE754标准
- 对于32位浮点数:符号位在最高位(1位),E 是阶码位(8位),M 是尾数位(23位)
浮点数的指数真值e 变成阶码的时候加上127
即
E = e + 127 E =e+127 E=e+127
规格化表示:一个规格化的32位浮点数x 的真值表示为
x = ( − 1 ) S ∗ ( 1. M ) ∗ 2 E − 127 x=(-1)^S*(1.M)*2^{E-127} x=(−1)S∗(1.M)∗2E−127