# 概念
- 进制数的最高位是符号位,0 表示正数,1 表示负数.(速记口诀,1 转 90° 就是 - 负号)
- 正数的原码,反码,补码都一样 (三码合一)
- 负数的反码 = 它的原码符号不变,其它位取反 (0->1 , 1->0) 零变成 1,1 变成零
- 负数的补码 = 它的反码 + 1, 负数的反码 = 它的补码 - 1
- 零的反码补码都是零
- Java 没有无符号数,换言之 Java 中的数都是有符号的
- 在计算机运算时,都是以补码的方式来运算的
- 当我们看到运算结果的时候,要看它的原码
# 原码,反码,补码的基础概念和计算方法
在探求为何机器要使用补码之前,让我们先了解原码,反码和补码的概念,对于一个数,计算机要使用一定的编码方式进行存储,原码,反码,补码是机器存储一个具体数字的编码方式:
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] 补
对于负数,补码表示方式也是人脑无法直观看出其数值的,通常也需要转换成原码在计算数值