定点数的表示
首先区分定点数和浮点数的区别
上面是采用了十进制的表示采用二进制的表示也一样。
定点数的表示包括了有符号数和无符号数的表示具体框架如下图
无符号数
无符号数一般只有整数没有小数,一般放入小数编译器会出错。
表示范围
n位的无符号数表示范围为:0 ~ 2^n-1
对于有符号数的表示就多了一个符号位的表示就相当于一个n位的二进制数只有n-1位起到作用因为要留出来一位表示符号,
有符号数
对于有符号数
注:可用原码、反码、补码三种方式来表示定点整数和定点小数。还可用移码表示定点整数。
移码不能表示小数
原码
原码:用尾数表示真值的绝对值,符号位“0/1”对应“正/负”
对于源码来说,真值0;有+0 和-0 两种形式
若机器字长n+1位,原码整数的表示范围:−(2^n−1) ≤ x ≤ 2^n−1(关于原点对称)
为什么要减1这是因为0占了-0和+0两个位置。
接下来看反码,其实反码没有什么用处他只是原码转补码的一个中间态而已
反码
正数的原码反码补码全部相同
对于反码的处理
正数不变
负数的话,将除符号位外全部取反
对于反码来说
真值0有+0 和-0 两种形式
[+0]原=00000000
[+0]反=00000000
[-0]原=10000000
[-0]反=11111111
若机器字长n+1位,反码整数的表示范围:−(2^n−1) ≤ x ≤ 2^n−1(关于原点对称)
若机器字长n+1位,反码小数的表示范围:−(1−2^−n) ≤ x ≤ 1−2^−n(关于原点对称)
补码
补码同时区分正负
正数和原码反码一样
负数,对于原码的反码加1就好
负数的补码=反码末位+1(要考虑进位)
注意!补码的真值0只有一种表示形式
[+0]补= [-0]补= 00000000
定点整数补码[x]补= 1,0000000表示x = -2^7
这就使得负数的表示形式多了一位。
定点整数补码[x]补= 1,0000000表示x = -27
若机器字长n+1位,补码整数的表示范围:−2^n ≤ x ≤ 2^n−1 (比原码多表示一个−2n )
定点小数补码[x]补= 1.0000000表示x = -1
若机器字长n+1位,补码小数的表示范围:−1 ≤ x ≤ 1−2^−n (比原码多表示一个−1 )
移码
移码: 补码的基础上将符号位取反。注意:移码只能用于表示整数
注意!补码的真值0只有一种表示形式
[+0]移= [-0]移= 10000000
若机器字长n+1位,移码整数的表示范围:−2n ≤ x ≤ 2n−1 (与补码相同
其实还有一种比较方便的手算方式这里后面介绍。