0%

原码、反码、补码

文章字数:495,阅读全文大约需要1分钟

机器数和真值

  • 真值: 即数字本身的值,例如-3
  • 机器数: 数字在计算机中存储的值,第一位为符号位1代表负数,0代表正数。后面的二进制代表绝对值,例如-3的机器数就是10000011

原码

  • 原码即机器数,是计算机对于数值的二进制表示方式
  • 除了第一位的符号位,其余便是绝对值。因此可以表示的范围为[1111 1111, 0111 1111][-127, 127]

反码

  • 正数不变
  • 负数在原码的基础上,除了符号位,其余取反
  • 为了解决数值减法的问题,通过反码可以让符号位也参与运算,从而将减法也转换成加法(2-1 = 2 + (-1))

补码

  • 正数不变
  • 负数在反码的基础上,+1
  • 为了解决反码存在两个值表示0的情况(因为存在符号位,所以有一个+0和-0)
  • 使用补码之后负数能比正数多表示一个值(正数需要表示0,负数部分不需要)
  • 所以补码表示范围就成了[-2^8, (2^8)-1][-127, +127]

计算机加减法

  • 补码将减法也变成了加法,计算机上数值都是以补码形式存储的,所以直接二进制相加即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public int add(int a, int b) {
if(a==0) {
return b;
}
if(b==0) {
return a;
}
// 两个都是1的需要进位
int c = a & b;
// 进位
c = c << 1;
// 按位相加,0+1=1,1+0=1,0+0=0,1+1=0(进位了,所以当前位为0),所以直接异或即可。
int d = a ^ b;
return add(c, d);
}
}