目录
原码
浮点数和定点数
定点数:小数点的位置固定 如:13.24 ——常规计数
浮点数:小数点的位置不固定 如: ——科学计数法
无符号数/有符号数的定点表示
无符号数:整个机器字长的全部二进制均为数值位,没有符号位,相当于数的绝对值
如:
表示范围:
2048 | 1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
为确定无符号数的表示范围,必须要规定其有效位数,假设使用8位二进制数,共有种状态,表示范围为
。n位的无符号数所表示的范围为
。
有符号数的定点表示:
定点整数:
定点小数:
符号位通常0表示正,1表示负;数值部分也称为尾数
原码
原码:用尾数表示真值的绝对值,符号位“0/1”对应“正/负”。若机器字长为n+1,则尾数占n位。
若要用原码表示定点整数17(机器字长8)则为:000010001
若要用原码表示定点小数-0.75(机器字长8)则为:11100000
原码整数的范围:
若机器字长n+1位,原码整数的表示范围:(关于原点对称)
机器字长有n+1位,本来可以有种状态,而表示的范围共有
种数值,就是因为真值0有+0(000...0)和-0(1000...0)两种形式。
原码小数的范围:
若机器字长n+1为,原码小数的表示范围:(关于原点对称),和定点整数一样,真值0有+0(000...0)和-0(100...0)两种形式。
反码
若符号位为0,则反码与原码相同;若符号位为1,则数值位全部取反
如(机器字长8位):
+17 -17
原码:00010001 原码:10010001
反码:00010001 反码:11101110
+0.75 -0.75
原码:01100000 原码:11100000
反码:01100000 反码:10011111
反码整数的表示范围:
若机器字长为n+1位,反码整数的表示范围为(关于原点对称),由于真值为0的原码有两种表示形式+0(000...0)其反码为(000...0),-0(100...0)其反码为(111...1),由此真值为0的反码也有+0和-0两种形式。
反码小数的表示范围:
若机器字长为n+1位,反码小数的表示范围为(关于原点对称),真值为0的反码也有+0和-0两种形式。
反码只是原码转为补码的中间过渡态,实际上并没有什么太大的用处。
补码
若符号数位0,则补码与原码相同,若符号位为1,则补码等于反码末位+1(要考虑进位)。
如(机器字长8位):
+17 -17
原码:00010001 原码:10010001
反码:00010001 反码:11101110
补码:00010010 补码:11101111
+0.75 -0.75
原码:01100000 原码:11100000
反码:01100000 反码:10011111
补码:01100001 补码:10100000
补码整数的表示范围:
若机器字长为n+1位,对于特殊的0,+0的反码为000...0,其补码也为000...0,而对于-0,他的反码为111...1,他的补码为1000..0由于考虑进位,他的补码有n+2位,但是我们是用n+1位字长的机器码,所以第n+2位会被舍弃,也就是说-0的补码为000...0和+0的补码是一样的,即0的补码是唯一的000...0。在000...0~111...1状态中,补码100...0无对应的原码(因为0的补码只有唯一的形式)因此,我们认为规定100...0为的补码。由于机器字长为n+1,能表示的范围为,
,由于补码人为将1000...0规定为
的补码,因此补码的整数的表示范围为
,比原码多了1个。
补码小数的表示范围:
如上所述,在此将100...0定为-1的补码,因此补码小数的表示范围为。
将负数的补码转回为原码:尾数取反+1
作用
补码的作用就是将减法变为等价的加法运算,使ALU无需集成减法器,以降低硬件的要求,减少成本
原理:
当对原码进行加减运算的时候,如果是一个正数+一个负数,我们需要将这个运算转为一个正数减去另一个正数,这就要求计算机有一个减法器才能完成。而减法器的电路设计比加法器困难的多,也就是说减法器的需要求会增加计算机硬件要求,计算机成本也会随之增加。
有人就提出用加法来代替减法,这样就可以减少计算机硬件的成本了。
在此以时钟为例,指针指向的10如何能指向7
正常的想法就是逆时针拨3个单位
这就相当于进行了10-3的操作
而另外一种(只考虑旋转角度小于360的)方法是顺时针拨9个单位
这就相当于进行了(10+9)%12的操作(时钟盘面只有12个单位)
由于 ,不难看出-3和+9在模12的条件下是等价的。在模12运算中,-15、-3、9、21是属于同一个等价类的(详细搜索离散数学等价类)。
由于 3 < 12 && 9 < 12 && |-3|+|9|=12,则我们称-3和9互为补数。也就是说互为补数的两个数的绝对值之和等于模数,并且两个数的绝对值都小于模数。
由此,在(mod m)的条件下,若能找到负数的补数,就可以用正数的加法来代替减法。
补数 = 模 - 负数的绝对值
以下我们规定定点整数的机器字长为8位,则最多能表示的数为即
。若某个运算使得最终的结果的二进制数位大于8位,则会舍弃溢出的部分,保留8位有效的数位,实际上这就是一个
运算。如1111 1111 + 10 = 1 0000 0001保留8位有效数位后,结果为0000 0001。
由于计算机天然的模运算,所以我们可以将减法转为对应补数的加法,若要计算14-14(0000 0111 + 1000 0111)根据上述补数的计算公式得到
-14的补码 = 模数(1 0000 0000) - (-14)的绝对值(0000 0111)
最终转为加法的计算式子为:14+(-14的补码) = 0000 0111 + 1111 1001 = 1 0000 0000
保留8位后结果为0。
之前说的补码等于反码+1,这并不是补码原生的定义,而是为了方便计算补码而得出的拿11000110来举例,他的绝对值为01000110,加上10111001则可以得到11111111再+1即可得到模数 所以补码为10111001(数位取反获得1111 1111)+1得到(1 0000 0000)。
移码
在补码的基础上将符号位取反。注意:移码只能用于表示整数
+17 -17
原码:00010001 原码:10010001
反码:00010001 反码:11101110
补码:00010010 补码:11101111
移码:00010010 移码:01101111
由于移码是由补码得到的,对于0,他的补码只有一种形式,因此0的移码也只有唯一的形式1000...0
若机器字长n+1位,移码整数的表示范围为。(移码和补码是一一影射的)
作用
若将移码的所有二进制位看作一个无符号数,那么移码随真值的增大而增大,根据此性质,可以通过移码进行整数的大小比较。
黄大牙牙yyds