机器码中的原码,反码,补码计算规则

在机器码中,通常在最左边添加一个不参与运算的符号位,用0表示正号“+”,1表示负号“-”


“◇”表示小数点位置,不占位

小数二进制的转换是小数部分每次乘以2然后取结果的整数部分,如0.5*1 = 1.0,就取1,后面没有了就不用再计算,但这里因为机器字长n为8,所以再补上6个0

设机器字长n为8,首位为符号位,不参与运算

各类机器码参考如下举例

原码

[ + 1 ] 原 = 00000001 [+1]_原 = 00000001 [+1]=00000001
[ − 1 ] 原 = 10000001 [-1]_原 = 10000001 [1]=10000001

[ + 127 ] 原 = 01111111 [+127]_原 = 01111111 [+127]=01111111
[ − 127 ] 原 = 11111111 [-127]_原 = 11111111 [127]=11111111

[ + 45 ] 原 = 00101101 [+45]_原 = 00101101 [+45]=00101101
[ − 45 ] 原 = 10101101 [-45]_原 = 10101101 [45]=10101101

[ + 0.5 ] 原 = 0 ◇ 1000000 [+0.5]_原 = 0◇1000000 [+0.5]=01000000
[ − 0.5 ] 原 = 1 ◇ 1000000 [-0.5]_原 = 1◇1000000 [0.5]=11000000


反码

正数的反码与原码相同

负数的反码是除了符号位,其余位按位取反(简单来说就是除了左边第一位,其余位的1变成0,0变成1)

[ + 1 ] 反 = 00000001 [+1]_反 = 00000001 [+1]=00000001
[ − 1 ] 反 = 11111110 [-1]_反 = 11111110 [1]=11111110

扫描二维码关注公众号,回复: 12428051 查看本文章

[ + 127 ] 反 = 01111111 [+127]_反 = 01111111 [+127]=01111111
[ − 127 ] 反 = 10000000 [-127]_反 = 10000000 [127]=10000000

[ + 45 ] 反 = 00101101 [+45]_反 = 00101101 [+45]=00101101
[ − 45 ] 反 = 11010010 [-45]_反 = 11010010 [45]=11010010

[ + 0.5 ] 反 = 0 ◇ 1000000 [+0.5]_反 = 0◇1000000 [+0.5]=01000000
[ − 0.5 ] 反 = 1 ◇ 0111111 [-0.5]_反 = 1◇0111111 [0.5]=10111111


补码

(注:考虑到计算的方便性,计算机系统中,数值一律用补码表示)
正数的补码与其原码和反码相同

负数的补码等于其反码末尾加1(1+1=0并且向前进一位,也就是前面的一位也要+1;1+0=1;0+0=0)
[ + 1 ] 补 = 00000001 [+1]_补 = 00000001 [+1]=00000001
[ − 1 ] 补 = 11111111 [-1]_补 = 11111111 [1]=11111111

[ + 127 ] 补 = 01111111 [+127]_补 = 01111111 [+127]=01111111
[ − 127 ] 补 = 10000001 [-127]_补 = 10000001 [127]=10000001

[ + 45 ] 补 = 00101101 [+45]_补 = 00101101 [+45]=00101101
[ − 45 ] 补 = 11010011 [-45]_补 = 11010011 [45]=11010011

[ + 0.5 ] 补 = 0 ◇ 1000000 [+0.5]_补 = 0◇1000000 [+0.5]=01000000
[ − 0.5 ] 补 = 1 ◇ 1000000 [-0.5]_补 = 1◇1000000 [0.5]=11000000

总结:在计算机器码时,首先判断符号是正还是负,然后写出其原码,正数的反码、补码和原码都是一样的,所以只需要记住负数的反码和补码计算方式即可

记忆:先反再补,负数反码按位取反、负数补码为反码末尾+1(符号位始终不变)

如有错误,欢迎评论留言指正

猜你喜欢

转载自blog.csdn.net/c_o_d_e_/article/details/106925942
今日推荐