各种数值在计算机中表示的形式称为机器数,其特点是采用二进制计数值,数的符号用0和1表示,小数点则隐含,表示不占位置。机器数对应的实际数值称为数的真值。
原码
若机器字长n等于8
[+1]原=0 0000001 | [-1]原=1 0000001 |
[+127]原=0 1111111 | [-127]原=1 1111111 |
[+45]原=0 0101101 | [-45]原=1 0101101 |
[+0.5]原=0 <>1000000 | [-0.5]原=1 <>1000000 |
[+0]原=0 0000000 | [-0]原=1 0000000 |
小数的二进制算法:
例如:0.375
0.375X2=0.750
0.75X2=1.51
0.5X2=11
所以,0.375的二进制为011
反码
[+1]反=0 0000001 | [-1]反=1 1111110 |
[+127]反=0 1111111 | [-127]反=1 0000000 |
[+45]反=0 0101101 | [-45]反=1 1010010 |
[+0.5]反=0 <>1000000 | [-0.5]反=1 <>0111111 |
[+0]反=0 0000000 | [-0]反=1 1111111 |
0表示正号,1表示负号,正数的反码与原码相同,负数的反码则是其绝对值求反。
补码
[+1]补=0 0000001 | [-1]补=1 1111111 |
[+127]补=0 1111111 | [-127]补=1 0000001 |
[+45]补=0 0101101 | [-45]补=1 1010011 |
[+0.5]补=0 <>1000000 | [-0.5]补=1 <>1000000 |
[+0]补=0 0000000 | [-0]补=0 0000000 |
0表示正号,1表示负号,正数的补码与其反码和原码相同,负数的补码则等于其反码的末位加1。
移码
[+1]移=1 0000001 | [-1]移=0 1111111 |
[+127]移=1 1111111 | [-127]移=0 0000001 |
[+45]移=1 0101101 | [-45]移=0 1010011 |
[+0.5]移=1 <>1000000 | [-0.5]移=0 <>1000000 |
[+0]移=1 0000000 | [-0]移=1 0000000 |
只要将补码的符号位取反便可获得相应的移码表示。
定点数:小数点不动的数。
浮点数
当机器字长为n时,定点数的补码和移码可表示个数。
阶符 | 阶码 | 数符 | 尾数 |
任意一个十进制浮点数N可以写成
xM
任意一个R进制浮点数N可以写成
xM
任意一个二进制浮点数N可以写成
xM
IEEE 754标准
注意:
- 阶码是用移码表示的,这里会有一个127的偏移量,它的127相当于0,小于127时为负,大于127时为正,
- 比如:10000001表示指数为129-127=2,表示真值为2^2,而01111110则表示2^(-1).
- 尾数全都是小数点后面的数,
- 但尾数中省略了一个1,因此尾数全为0时,也是1.0...00;
真值公式
单精度:single,32位
xx e=E-127
双精度:double,64位
xx e=E-1023
对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知
S | E | M | 表示公式 | 偏移量 |
1 | 8 | 23 | xx | 127 |
1 | 11 | 52 | xx | 1023 |
例子:123.456
二进制:N(2)= 1111011. 01110100101111001,向右移6位,得
N(2)=1.11101101110100101111001x2^6 即 e=6,E=6+127=133
则
符号位(s) | 阶码(E) | 尾数(M) |
0 | 10000101 | 11101101110100101111001 |
浮点数的运算
x x
- 对阶:K=|i-j|,把阶码小的数的尾数右移K位,使其阶码加上K。
- 求尾数和(差)
- 结果规格化并判溢出
- 舍入处理
- 溢出判别