模是指一个计量系统的计数范围。如时钟等。计算机也是一个计算器,它也是有一个计量范围,即都存在一个“模”。
如时钟的计量范围是0~11,模 = 12。
32位计算机的计量范围是2^32,模 = 2^32。
html
假设当前时针指向11点,而准确时间是8点,调整时间可有如下两种拨法:spa
11-3=8
11+9=12+8=8
在以模为12的系统中,加9和减3效果是同样的,所以凡是减3运算,均可以用加9来代替。对“模”12而言,9和3互为补数(两者相加等于模)。因此咱们能够得出一个结论,即在有模的计量系统中,减一个数等于加上它的补数,从而实现将减法运算转化为加法运算的目的。.net
在补码中,0有惟一的表示。code
# 按以上理论,减一个数等于加上它的补数,因此 5 - 3 # 等价于 5 + (16 - 3) // 算术运算单元将减法转化为加法 # 用二进制表示则为: 0101 + (10000 - 0011) # 等价于 0101 + ((1 + 1111) - 0011) # 等价于 0101 + (1 + (1111 - 0011)) # 等价于 0101 + (1 + 1100) // 括号内是3(0011)的反码+1,正是补码的定义 # 等价于 0101 + 1101 # 因此从这里能够获得 -3 = 1101 # 即 `-3` 在计算机中的二进制表示为 `1101`,正是“ -3 的正值 3(`0011`)的补码(`1101`)”。 # 最后一步 0101 + 1101 等于 1001
移码经常使用来表示浮点数的阶码。IEEE754中解码用移码表示。htm
其中X为真值,与补码相比,数值位彻底相同,符号位相反。blog
阶码部分E采用的是移码。io
为何采用移码?微博
原文:https://blog.csdn.net/a7515780/article/details/60469155class
单精度浮点数(32位),阶码(后面的用偏移阶码表示,其实在IEEE754表示单精度浮点数都是一个概念)8位,那么原来8位二进制数有符号二进制表示范围是-127~127,可是IEEE为了避免在阶码中引入符号位,且8位偏移阶码(阶码中二进制数为无符号数)范围是1~254(为何不包括0和255?后面说),所以引入偏移码(移码),在有符号位的二进制基础上加127,那么就有了偏移阶码范围0~254,可是0不合法,后面说,所以偏移阶码范围是1~254。 为何是127呢??是否是不少人都有这个疑惑。 加上127不就从原来的二进制有符号转变为无符号了嘛。IEEE不就是为了避免在阶码E中不引入符号位才加的127嘛。基础
填坑,为何范围是1~254?
由于0用8位阶码用全0表示,255用8位阶码用全1。 出现全0,尾数M全0,符号位为0,为正0,符号位为1,为负0(IEEE754规定的浮点数有正0负0之分),偏移阶码出现全1,尾数M全0,符号位S为0,为正无穷大,符号位S为1,为负无穷大。 这就是为何不把0和255放入偏移阶码范围中的缘由。
即:全尾数全0或全1时表示其余特殊意义的数。
我以前也在纠结这个问题,纠结在为何是127不是128或者其余数,其实很简单,就是为了将有符号转换为无符号。 但愿我这篇微博能够帮到还处于迷茫的小伙伴。
而移码是真值加一个偏移值获得的。
因此一个浮点数可表示为:
不一样状况: