在学习原码,反码、补码和移码之前,需要先了解机器数和真值的概念。
机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。
那么,这里的 00000011 和 10000011 就是机器数。
真值:因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例如:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
机器数:\([x]_原\)=0101
关于原码、反码和补码的详解,请看:原码、反码、补码的使用及其原理
理解:
补码是为了化减法为加法方便计算机设计运算;
移码是为了方便比较大小,用在浮点数的阶码中。
关于浮点数的详解,请看:浮点数在计算机中的表示与转二进制
浮点数的特殊情况:
基本原理:增加冗余码
理解:增加码距就是增加非法编码的数量,看到非法编码就算检查出错误了,而非法编码距离哪个合法编码比较进就认为正确的应该是什么(简单理解,可参考下面的图),也就是可以纠正错误。
这里看到过一个好的几何理解图,仔细品味下:
举个例子:比如一共有 8 位,码距为 1 则检查不出任何错误,因为所有编码都是合法编码。如果码距为 2,那合法编码应该像 00000000, 00000011, 00001100, 00001111 这样,那如果出现 00000001 这样的非法编码就出错了,可检查一位错,但如果两位同时错了,则有可能又跳到另一个合法编码上了,就检查不出 2 位错。
那如果码距是 3,那合法编码应该像 00000000, 00000111, 00111000, 00111111 这样,那如果出现一位错 00000001,或者两位错 00000011,都是非法编码,都能检查出错误,并且此时可以纠正 00000001 为 00000000,纠正 00000011 为 00000111。但是三位同时错就检查不出了。
ps:海明编码最强视频演示教程:https://www.youtube.com/watch?v=373FUw-2U2k
原文:https://www.cnblogs.com/blknemo/p/12811110.html