原码
移码
- 移码通常用来表示指数(阶码),这样便于浮点数加减运算时的对阶操作(比较大小)
补码
- 一个负数的补码等于模减去该负数的绝对值
- 对于一个确定的模,某数减去小于模的另一数,总可以用该数加上另一负数的补码来代替。
在4位十进制模运算系统中9828-1928可以转换为9828加-1928的补码,各位取反,末尾加1,即8072,加上后取模即可。
- 一个负数的补码等于其绝对值补码各位取反,最低位加1
- 对于正数来说,它的补码是它本身加上模后取模,结果是它本身
- X是真值,[X]补是机器数
- 机器数:一个数在计算机中的二进制表示形式,机器数是带符号的,在计算机中用最高位来表示,正0负1
- 真值:机器数对应的真正数值,因为第一位是符号位,所以机器数不等于真正的数值
若有n位机器数则
- -2^n-1的补码第一位(符号位)为1,其余位全部为0,图中的字迹用的方法是模减去该负数的绝对值
- -1的补码所有位都是1
- 0的补码所有位都是1
变形补码
- 变形补码,拿4位二进制数来说,最高位是符号位,数值位是三位,当表示8时会发生溢出。变形补码采用双符号位,存放可能的溢出结果所以可以容许这种错误,可以表示8了
- 通常在机器中用变形补码来存放中间结果这样就算溢出也没有关系,保证最终结果的容错率
- 中间结果:与最终结果相对,也是由计算机产生的结果,是最终结果之前的各种小运算的结果。中间结果是仅供计算最终结果使用,不需要输出,但要在计算机中暂存,一般用寄存器储存
- 最终结果:最终结果是最终输出给用户的结果
个人理解:对于一个确定的模,某数减去小于模的另一数,总可以用该数加上负数的补码来代替,而一个负数的补码等于模减去该负数的绝对值。4位二进制能表示的真值范围为0~15,能表示的机器数范围是-8~7(第一位用作符号位),0~7的补码都是原码,和真值的二进制表示相同,而负数的补码是数值位取反加1,这实际上是个映射行为,0~7的机器数0000~0111是没问题的,如果4位二进制数正常表示,不考虑计算、符号位等因素,可以表示0~15(0000~1111),而-1~-8的正好对应了8~15的二进制真值,-8对应8,-1对应15,加减运算实际上对应了模16系统的运算,7-6=7+[6]补=0111+1010=0001,正对应这模16中的7-6=7+10,对-6(1110)数值位按位取反,得到1001,对应的是9,所以还要再加1,也可以用模减去负数绝对值这个方法求得(个人感觉这个方法更贴合原理,按位取反的方法最简单粗暴但也比较抽象)。所以求补码的过程实际上就是一个映射的过程,将负数映射到特定模中与之相对应的正数上,将减操作等效转换成对相对应的正数的加操作。(OS:还是没有把自己的理解完整表达出来,就这样吧 )