原码、补码、反码、移码

机组–原码、补码、反码、移码

首先,对于正数而言,原码=反码=补码

在开始下面内容前,做以下约定: X X X表示真值, [ X ] 原 [X]_原 [X]表示原码, [ X ] 反 [X]_反 [X]表示反码, [ X ] 补 [X]_补 [X]表示补码。并且您可能需要一定的将十进制数转化为二进制数的基础。

有符号数与无符号数

  • 无符号数:整个机器字长的全部二进制均为数值位

    如 :

    X = + 27 X=+27 X=+27

    无符号数为: 11011 11011 11011

  • 有符号数:在"无符号数"的最高位添加符号位:+:0,-:1

    如 :

    X = + 27 X=+27 X=+27

    有符号数为: 011011 011011 011011

    X = − 27 X=-27 X=27

    有符号数为: 111011 111011 111011

原码

机器数最高位表示符号,其余位表示该数的绝对值

如果规定了机器字长,而我们的原码位数又不够时,需要我们进行补零,之后再修改符号位。

具体的:

  • 当为整数时:在有效数值最高位前面补零,不影响整体取值。之后将最高位修改为符号位

    假定机器字长为8位

    X = + 27 X=+27 X=+27 [ X ] 原 [X]_原 [X] 00011011 00011011 00011011

    X = − 27 X=-27 X=27 [ X ] 原 [X]_原 [X] 10011011 10011011 10011011

  • 当为小数时:在有效数值最低位后面补零,不影响整体取值。之后再将最高位修改为符号位

    假定机器字长为8位(定点小数表现形式可见下方"定点小数")

    X = + 0.625 X=+0.625 X=+0.625 [ X ] 原 [X]_原 [X] [ 0.1010000 ] [0.1010000] [0.1010000]

    X = − 0.625 X=-0.625 X=0.625 [ X ] 原 [X]_原 [X] [ 1.1010000 ] [1.1010000] [1.1010000]

值得注意的是,真值0有两种不同形式表达: [ + 0 ] 原 = [ 0000 ] 、 [ − 0 ] 原 = [ 1000 ] [+0]_原=[0000]、[-0]_原=[1000] [+0]=[0000][0]=[1000]

机器数的定点表示

  • 定点小数:纯小数,小数点 . 位置在符号位之后、有效数值部分最高位之前。符号位:+:0、-:1,位于最前。

    这里的纯小数指的是,整数部分为零。 0.0101 0.0101 0.0101 √、 1.0101 1.0101 1.0101 ×、

    如: [ + 0.625 ] 原 = [ 0.101 ] [+0.625]_原 = [0.101] [+0.625]=[0.101] [ − 0.125 ] 原 = [ 1.001 ] [-0.125]_原 = [1.001] [0.125]=[1.001]

  • 定点整数:纯整数,小数点 . 位置在有效数值位最低位之后。且在最前面用逗号, 将整数部分与符号位隔开

    如: [ + 27 ] 原 [+27]_原 [+27] = 0 , 11011 0,11011 0,11011 [ − 27 ] 原 [-27]_原 [27] = 1 , 11011 1,11011 1,11011

反码

对于正数,其反码与原码形式一致。

[ + 27 ] 原 = 00011011 [+27]_原=00011011 [+27]=00011011 => [ + 27 ] 反 [+27]_反 [+27] = 00011011 00011011 00011011

[ + 0.625 ] 原 = [ 0.1010000 ] [+0.625]_原=[0.1010000] [+0.625]=[0.1010000] => [ + 0.625 ] 反 = [ 0.1010000 ] [+0.625]_反=[0.1010000] [+0.625]=[0.1010000]

对于负数,将原码的符号位保持不变,其余部分按位取反。

假定机器字长8位

[ − 27 ] 原 [-27]_原 [27] = 10011011 10011011 10011011 => [ − 27 ] 反 [-27]_反 [27] = 11100100 11100100 11100100

[ − 0.625 ] 原 = [ 1.1010000 ] [-0.625]_原=[1.1010000] [0.625]=[1.1010000] => [ + 0.625 ] 反 = [ 1.0101111 ] [+0.625]_反=[1.0101111] [+0.625]=[1.0101111]

值得注意的是,真值0有两种不同形式表达: [ + 0 ] 反 = [ 0000 ] 、 [ − 0 ] 反 = [ 1111 ] [+0]_反=[0000]、[-0]_反=[1111] [+0]=[0000][0]=[1111]

补码

原码转补码:

对于正数,其补码与原码形式一致。

对于负数,在反码的基础上+1。
值得注意的是,真值0的补码表现形式唯一。

[ − 27 ] 原 [-27]_原 [27] = 10011011 10011011 10011011 => $ [-27]_补$= [ − 27 ] 反 + 1 [-27]_反+1 [27]+1 = 11100100 11100100 11100100 +1 = 11100101 11100101 11100101

[ − 0.625 ] 原 = [ 1.1010000 ] [-0.625]_原=[1.1010000] [0.625]=[1.1010000] => [ − 0.625 ] 补 [-0.625]_补 [0.625] = [ − 0.625 ] 反 + 1 = 1.0101111 + 1 [-0.625]_反+1=1.0101111+1 [0.625]+1=1.0101111+1 = 1.0110000 1.0110000 1.0110000

另法一:

假设负纯整数X,将其转化为原码共有二进制位数 N + 1 N+1 N+1,则X补码为: [ 2 N + 1 − ∣ X ∣ ] [2^{N+1}-|X|] [2N+1X]

如:X = -13 = [ − 1101 ] [-1101] [1101] => [ − 1101 ] 原 = [ 11101 ] [-1101]_原=[11101] [1101]=[11101] ,其中二进制位数为 5 5 5 => 2 5 = 32 2^5=32 25=32

因此其 补码为: [ X ] 补 = 32 − ∣ − 13 ∣ = 19 = [ 10011 ] [X]_补=32-|-13| = 19 = [10011] [X]=3213=19=[10011]

另法二:

对负定点小数的原码X,从右往左扫描,尾数的第一个1及其右部的0保持不变,左部的各位取反,符号位保持不变。

[ X ] 原 = [ 1.1110011000 ] [X]_原=[1.1110011000] [X]=[1.1110011000] =>1.0001101000

补码转原码:

规则:对于负数,补码的除符号位取反后+1

[ − 13 ] 补 = [ 10011 ] [-13]_补=[10011] [13]=[10011] =>取反=> [ 11100 ] [11100] [11100] =>+1=> [ − 13 ] 原 = [ 11101 ] [-13]_原=[11101] [13]=[11101]

移码

一个真值的移码和补码仅差一个符号位,将补码符号位取反即可得到移码。

附录

一些码的可表示范围:

n n n 位码最小值最大值
无符号小数0 1 − 2 − n 1-2^{-n} 12n
无符号整数0 2 n − 1 2^n-1 2n1
定点小数 − ( 1 − 2 − n ) -(1-2^{-n}) (12n) 1 − 2 − n 1-2^{-n} 12n
定点整数 − ( 2 n − 1 ) -(2^{n}-1) (2n1) 2 n − 1 2^{n}-1 2n1
原码纯小数 − ( 1 − 2 − ( n − 1 ) ) -(1-2^{-(n-1)}) (12(n1)) 1 − 2 − ( n − 1 ) 1-2^{-(n-1)} 12(n1)
原码纯整数 − ( 2 ( n − 1 ) − 1 ) -(2^{(n-1)}-1) (2(n1)1) 2 ( n − 1 ) − 1 2^{(n-1)}-1 2(n1)1
反码纯小数 − ( 1 − 2 − ( n − 1 ) ) -(1-2^{-(n-1)}) (12(n1)) 1 − 2 − ( n − 1 ) 1-2^{-(n-1)} 12(n1)
反码纯整数 − ( 2 ( n − 1 ) − 1 ) -(2^{(n-1)}-1) (2(n1)1) 1 − 2 − ( n − 1 ) 1-2^{-(n-1)} 12(n1)
补码纯小数 − 1 -1 1 (比原码多表示 − 1 -1 1) 1 − 2 − ( n − 1 ) 1-2^{-(n-1)} 12(n1)
补码纯整数 − 2 n -2^n 2n (比原码多表示 − 2 n -2^n 2n) 2 ( n − 1 ) − 1 2^{(n-1)}-1 2(n1)1
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值