原码

原码是指将最高位作为符号位(0表示正,1表示负),其它数字位代表数值本身的绝对值的数字表示方式。

  1. 60 000 0110
  2. -61 000 0110

反码

如果是正数,则表示方法和原码一样;如果是负数,符号位不变,其余各位取反

  1. 600000110
  2. -611111001

补码

如果是整数,则表示方法和原码一样;如果是负数,则将数字的反码加上1(相当于将原码数值位取反然后在最低位加1)

  1. 600000110
  2. -611111010

移码

将补码符号位取反

  1. 610000110
  2. -601111010

注意:0的反码、补码都为零

左移

当数值左、右移时,先将数值转化为其补码形式,移完后,再转换成对应的原码
高位丢弃,低位补零
[+1] = [00000001]补
[0000 0001]补 << 1 = [0000 0010]补 = [0000 0010]原 = [+2]
[-1] = [1000 0001]原 = [1111 1111]补
[1111 1111]补 << 1 = [1111 1110]补 = [1000 0010]原 = [-2]

  • 如果只能用8位表示:

[-65] = [1011 1111]补
[1011 1111]补 << 1 = [0111 1110]补 = [0000 0010]原 = 2,明显丢失了

右移

高位补符号位(负数补1,正数补0),低位丢弃
[+127] = [0111 1111]原 = [0111 1111]补
[0111 1111]补 >> 1 = [0011 1111]补 = [0011 1111]原 = [+63]
[-127] = [1111 1111]原 = [1000 0001]补
[1000 0001]补 >> 1 = [1100 0000]补 = [1100 0000]原 = [-64]

Java的无符号右移

都补0

Java的左移

左移不区分有符号和无符号,都是左移之后右边补上0,最左边的符号位也直接移走