最近复习了一下计算机组成原理,关于原码、反码和补码有了全新的认识。
众所周知,计算机内的数据都是以二进制机器数的形式表示,原码、反码、补码的出现,是为了计算机硬件能更加方便直接地使用数据,是否有利于运算器设计的优化以及简化。
机器数对应的实际数值称为真值,符号用"+","-"表示.
机器数有有符号和无符号之分,
有符号的机器数,用二进制的最高位表示真值的符号,"0"表示正数,"1"表示负数.
对于无符号而言, 无符号数均是正数, 在机器数中没有符号位。若约定小数点的位置在最低位之后, 则表示纯整数; 若小数点的位置在最高位之后, 则表示纯小数.
为了机器运算, 带符号的机器数可以用原码, 反码 ,补码, 移码等不同的码制.
由于原码和反码不利于做减法, 即不同符号位的数值相加, 因此诞生了补码(至于为何原码和反码不利于机器做减法, 请体会举例2). 在带符号数的运算中, 可以这样说, 原码和反码都是为了转换成补码的中间数.
原码即将真值写成二进制的形式,最高位为符号位. 有+0和-0之分.
反码即将符号位为1的原码, 除符号位外, 按位取反. 正数不变. 有+0和-0之分.
补码即将符号位为1的反码末位加1,正数不变. 无+0和-0之分, 0的补码即为[+0]的原码. 可表示的数比原码和反码多一个.
举例1:
若机器的字长为4, 真值1,-1,7,-7, 4,-4的原码,反码和补码表示如下:
|
1 |
-1 |
7 |
-7 |
4 |
-4 |