首页 > 代码库 > 有符号数处理

有符号数处理

在数学中,任意基数的负数都在最前面加上“−”符号来表示。在计算机硬件中,数字都以无符号的二进制形式表示,因此需要一种将负数编码为二进制形式的方法。

 

当前有以下四种方法,用于扩展二进制数字系统,来表示有符号数:

原码(sign-and-magnitude),

反码(ones‘ complement),

补码(two‘s complement),

移码(excess-N)。

 

在学习原码, 反码、补码和移码之前, 需要先了解机器数和真值概念。

1、机器数

机器数:数在计算机中的二进制表示形式。

机器数是带符号的,在计算机中用二进制数的最高位存放符号, 正数为0, 负数为1。

 

例如:

计算机字长为8位,则:

十进制数+3 ,转换成二进制00000011,

十进制数-3 ,转换成二进制10000011。

那么,这里的00000011和10000011就是机器数。

2、真值

因为二进制数的最高位是符号位,所以机器数的形式值就不等于真正的数值。为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。即第一位用+-表示数字的正负,其余为二进制数。

例如:

0000 0001的真值= +000 0001,1000 0001的真值= –000 0001。

3、原码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。

下图为原码计算公式:

 技术分享

4、反码

反码的表示方法正负数不同:

正数的反码是其本身,

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。

下图为反码计算公式:

 技术分享

5、补码

补码的表示方法正负数也不同:

正数的补码就是其本身,

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基
础上+1)。

下图为补码计算公式:

 技术分享

6、移码

移码,是将二进制原码无符号整数所代表的值,减去一个预设值。

标准移码,预设值为二进制原码表示的最大整数的一半。 一个数的标准移码和补码,最高位相反,其余各位均相同。即不管正负数,只要将其补码的符号位取反即可。

下图为移码计算公式:

 技术分享

 

PS:正数的原、反、补码都一样;0的原码跟反码都有两个,因为这里0被分为+0和-0;0的补码是唯一的。

有符号数处理