原码、反码、补码的介绍
原码
原码是计算机表示有符号整数最直接的方法。它的最高位(符号位)表示数字的正负号,剩下的位表示该数字的大小(即绝对值)。
- 符号位:0 表示正数,1 表示负数。
- 其余位:表示数值的大小。
例如,用 8 位表示:第一位表示符号,其余7位表示大小
- +5 的原码表示为:
0000 0101
- -5 的原码表示为:
1000 0101
优点:简单直观,人类容易理解。
缺点:不能直接进行加减法运算,尤其是处理负数时比较复杂。
反码
反码是对原码的一种改进,用于简化负数运算。正数的反码与原码相同,而负数的反码则是其原码的符号位保持不变,其余各位取反(0 变 1,1 变 0)。
- 正数的反码:与原码相同。
- 负数的反码:将该负数的原码(除了符号位)逐位取反。
例如,用 8 位表示:
- +5 的反码:
0000 0101
- -5 的反码:
1111 1010
优点:比原码更便于运算,尤其是减法。
缺点:存在两个零(0000 0000
表示正零,1111 1111
表示负零),导致零的表示不唯一。
补码
补码的表示是唯一的
下面解释-128的补码
过这个练习可知,在字长为8的计算机中,-128的补码为1,0000000
而在原码中1,0000000表示0
补码是现代计算机中最常用的二进制编码方式,用于表示有符号整数。它的最大特点是把负数的表示形式变成了计算上更容易处理的形式。补码的定义是:正数的补码与原码相同,负数的补码是其反码加 1。
- 正数的补码:与原码相同。
- 负数的补码:是其反码 + 1。
例如,用 8 位表示:
- +5 的补码:
0000 0101
- -5 的补码:
1111 1011
(反码是1111 1010
,加 1 得到1111 1011
)。
优点:
- 只有一个零,消除了两个零的问题(
0000 0000
表示零)。 - 运算更简单,可以直接进行加减法运算。
- 是现代计算机中广泛使用的有符号数表示方法。
- 补码的符号位可以直接参与运算
缺点:表示负数的范围比表示正数的范围要大一位。
移码
移码是在原码的基础上,将符号位取反得到的。
原码、反码、补码的关系图
快捷转换
正数的原码和补码相同,因为正数的表示方式不需要复杂的处理。
负数的补码与原码不同,是为了简化计算机的运算过程,消除负零问题,并统一加法和减法的处理方式。补码的设计让负数可以通过简单的加法器进行运算,而不需要特殊的减法器,极大地简化了硬件设计。
一定要注意正数的原码、反码、补码、移码都是一样的
移码是人为规定的
原码、反码、补码、移码的关系图
无符号整数的加法
比较简单不过多介绍
无符号整数的减法
减法运算比较昂贵,所以要将减法运算转化为加法运算
有符号的整数的运算
要先转化为补码,只有补码机器才能运算
注意:这里运算的结果为补码要记得转化为原码
减法就是转化为加法
我们可以发现这个与无符号整数的减法解决办法一样,那个减法变加法也相当于相反数,例如99-9=99+(-9)
可以这么理解:两个相反数相加为0,按位取反后两个数相加全为1,再在末尾加1;就会溢出全变成0