原码 反码 补码 移码

Posted 顧棟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原码 反码 补码 移码相关的知识,希望对你有一定的参考价值。

计算机的计算都是使用二进制。底层的数据也是"二进制表达形式的补码形式"

机器数:一个数在计算机中使用二进制的表示形式,机器数带符号,使用最高位存放符号,0代表正数,1代表负数。

真值:正数或者负数的真值就是其绝对值对应的二进制数,将第一位符号位直接用负号表示。0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1。

通过JAVA中的int型举例介绍下来概念,int型占用4个字节(byte),也就是第32位(bit)存放符号。

原码:符号位+真值,即使用最高位存放符号,0代表正数,1代表负数。

32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1  | 位的序号
--------------------------------------------------------------------------------------  | 
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0 1 1  | 3的二进制原码
 1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0 1 1  | -3的二进制原码

反码:正数的反码即原码,也就是说正数的反码与原码一样。负数的反码是在原码的基础上,符号位不变,其余位进行取反,也就是1变0,0变1。

32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1  | 位的序号
--------------------------------------------------------------------------------------  | 
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0 1 1  | 3的二进制反码
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 1 1 1 1 1 1 1 0 0  | -3的二进制反码

补码:正数的补码即原码,同样的正数的补码与原码一致。负数的补码在其原码的基础上,符号位不变,其余位进行取反,最后在加1。

32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1  | 位的序号
--------------------------------------------------------------------------------------  | 
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0 1 1  | 3的二进制补码
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 1 1 1 1 1 1 1 0 1  | -3的二进制补码

移码:移码是对补码的符号位进行取反。

32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1  | 位的序号
--------------------------------------------------------------------------------------  | 
 1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0 1 1  | 3的二进制移码
 0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 1 1 1 1 1 1 1 0 1  | -3的二进制移码

为了尽可能的简单的实现硬件的电路设计,计算机只去进行加法运算,这样对于两数想减,可以变为一个正数加一个负数。负数的计算就使用了反码来实现。但是还有一个问题就是0的表示会出现正负0的问题,于是使用了补码来统一0的编码,同时补码还可以多表示一个最小值,以int型为例,其中使用了32位来存数。

使用反码计算减法

使用补码解决0的符号位以及两个编码的问题(正负0),同时多出一个最低位。这也是int类型最小值可以是 − 2 31 -2^31 231,而最大值是 2 31 − 1 2^31-1 2311的原因。

以上是关于原码 反码 补码 移码的主要内容,如果未能解决你的问题,请参考以下文章

原码反码补码移码

原码反码补码移码真值(及(8C5A3E00)16计算)

原码补码反码和移码

原码反码补码移码之间的关系和转换

软考之 原码反码补码移码的区别

原码补码反码