什么是原码、反码、补码
简介
在计算机中,原码、反码、补码是表示有符号整数的三种二进制编码方式。在Java中,整数默认采用补码进行运算。
什么是二进制
二进制是一种计数系统,它由两个数字 0 和 1 组成。在计算机科学中,二进制常被用于表示计算机中的数字、字符和指令。每一位二进制数字称为一个位(bit),每八位(bit)组成一个字节(byte)。在二进制中,每个位(bit)只有两种状态,即0和1,这和十进制中每个数字有10种状态是不同的。因此,二进制可以被看作是一种基于二元逻辑的数学运算方式,也是计算机科学中最基本、最重要的基础。
二进制分为:
8位(0000 0000)
16位(0000 0000 0000 0000)
32位(0000 0000 0000 0000 0000 0000 0000 0000)
64位(0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000)
举例:
0 对应的8位二进制数 = 0000 0000
1 对应的8位二进制数 = 0000 0001
3(2+1) 对应的8位二进制数 = 0000 0011
5(4+1) 对应的8位二进制数 = 0000 0101
那么就可以理解为:0的原码是0000 0000,1的原码是0000 0001,3的原码是0000 0011
原码
原码是最简单的表示方式,它的表示方法是用第一位表示符号,0表示正数,1表示负数,其余位表示数值的绝对值。
例如,8位原码表示法中,+5的原码为 00000101,-5的原码为 10000101。
反码
反码是为了解决原码的符号位参与运算的问题而提出的一种表示方式。
正数的反码与原码相同,负数的反码是对其原码除符号位之外的各位取反(0变成1,1变成0)。
例如,8位反码表示法中,+5的反码为 00000101,-5的反码为 11111010。
补码
补码是为了解决反码表示法中存在的“0有两个编码”的问题而提出的一种表示方式。
正数的补码与原码和反码相同(三码合一),负数的补码是在其反码的基础上加1。
例如,8位补码表示法中,+5的补码为 00000101,-5的补码为 11111011。
转换过程
从原码转换为反码:
对于正数而言,直接使用原码作为反码。
对于负数而言,将其原码的除符号位之外的各位取反。
从反码转换为补码:
对于正数而言,直接使用反码作为补码。
对于负数而言,将其反码加1得到补码。
从补码转换为反码和原码:
对于正数而言,补码的反码和原码都与补码相同。
对于负数而言,补码的反码是在其基础上减1,原码则是符号位不变,其余位与反码相同。
为什么使用补码?
使用补码表示数值,能够有效地解决负数在计算机中的表示问题,避免了原码和反码的运算符号位参与运算的问题,同时也避免了反码存在两个0的问题。因此,在计算机中使用补码表示数值是一种比较常见的表示方式。
总结
- 二进制最高位(最左边)是符号位:0表示正数,1表示负数
- 正数的原码、反码、补码都一样(正数三码合一)
- 0的反码、补码都是0
- 负数的反码=原码符号位不变,其他位取反(0->1,1->0)
- 负数的补码=反码+1
- 负数的反码=负数的补码-1
- Java中没有无符号数(Java中的数都是有符号的)
- 在计算机运算中,都是以补码的方式来运算的
- 当我们看运算结果时,要看原码
例如:
-5 的原码: 1 0 0 0 0 1 0 1
-5 的反码: 1 1 1 1 1 0 1 0
-5 的补码: 1 1 1 1 1 0 1 1