# 概念

  1. 进制数的最高位是符号位,0 表示正数,1 表示负数.(速记口诀,1 转 90° 就是 - 负号)
  2. 正数的原码,反码,补码都一样 (三码合一)
  3. 负数的反码 = 它的原码符号不变,其它位取反 (0->1 , 1->0) 零变成 1,1 变成零
  4. 负数的补码 = 它的反码 + 1, 负数的反码 = 它的补码 - 1
  5. 零的反码补码都是零
  6. Java 没有无符号数,换言之 Java 中的数都是有符号的
  7. 在计算机运算时,都是以补码的方式来运算的
  8. 当我们看到运算结果的时候,要看它的原码

# 原码,反码,补码的基础概念和计算方法

在探求为何机器要使用补码之前,让我们先了解原码,反码和补码的概念,对于一个数,计算机要使用一定的编码方式进行存储,原码,反码,补码是机器存储一个具体数字的编码方式:

1. 原码:

源码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值,比如如果是 8 位二进制

[+1] 原码 = 0000 0001

[-1] 原码 = 1000 0001

第一位是符号位,因为第一位是符号位,所以 8 位进制数的取值范围就是

[1111 1111 , 0111 1111]

[-127 , 127]

原码是人脑最容易理解和计算的表示方式

2. 反码

反码的表示方法是:

正数的反码是其本身.

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

[+1] = [00000001] 原 = [00000001] 反

[-1] = [10000001] 原 = [11111110] 反

可见如果一个反码表示的是负数,人脑无法直观看出来它的数值,通常要将其转换成原码再计算

3. 补码

补码的表示方法是:

正数的补码就是其本身

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

[+1] = [00000001] 原 = [00000001] 反 = [00000001] 补

[-1] = [10000001] 原 = [11111110] 反 = [11111111] 补

对于负数,补码表示方式也是人脑无法直观看出其数值的,通常也需要转换成原码在计算数值