软件设计师--计算机组成原理和结构(原码、反码、补码、移码)

272 阅读3分钟

这是我参与更文挑战的第2天,活动详情查看: 更文挑战

原码、反码、补码、移码

为方便表述,以一个字节8位来表示。

原码

原码就是把一个数转为二进制表示,把最高位变成符号位,如果是正数就设为0,负数就设为1
例如:+1 二进制表示为0000 0001,最高位变为符号位0,即0000 0001
     -1 二进制表示为0000 0001,最高位表示为符号位,即1000 0001
     
     那么有意思的就来了,+0和-0怎么表示呢?
     +0用原码表示为0000 0000
     -0用原码表示为1000 0000
     好奇怪呀,同样是0却用原码表示出来不一样,这也是原码的一个缺点,这也为后面补码的出现埋下了伏笔。

在了解补码之前,我们首先学习什么是反码。

反码

正数的反码和原码相同。
负数的反码是原码保持最高位,即符号位不变,其余位按位取反。
例如:+1的反码和原码相同为0000 0001
     -1的原码为1000 0001,反码为1111 1110

学习完反码后在学习补码就容易很多了。

补码

正数的补码和原码相同;
负数的补码是其反码末位加1。
例如:+1的补码和原码相同为0000 0001
     -1的补码为其反码加1 即1111 1111
    此时你发现+0和-0的补码只有一个即 0000 0000(不防亲自动笔来验证一下这神奇的一幕。)数的一致性给补码的运算带来了极大的便利。

最后一个是移码,移码多用于浮点数的运算中。

移码

移码用于浮点数的运算中充当阶码,后面我会详细来讲浮点数的运算。
移码是补码的符号位取反得到。
例如:+1的补码为0000 0001,移码为1000 0001
      -1的补码为1111 1111,移码为0111 1111     

那么,原码,反码和补码的范围是多少呢? 大家可以参考下表

image.png

当n为8时
原码范围为 -127~127
反码范围为 -127~127
补码范围为 -128~127
你会发现补码的范围比原码和反码略大些,这是为什么呢?
原因就在于原码和反码+0和-0的表示不同,一次多占了一个编码位,这个大家只需要了解即可。

下期我会将数据的表示——浮点数的运算,也是重要的一节,欢迎大家前来指正。

以上就是原码,反码、补码和移码的概述,欢迎大家评论。如有错误,欢迎指正。