原码
原码是指将最高位作为符号位(0表示正,1表示负),其它数字位代表数值本身的绝对值的数字表示方式。
6:0 000 0110-6:1 000 0110
反码
如果是正数,则表示方法和原码一样;如果是负数,符号位不变,其余各位取反
6:00000110-6:11111001
补码
如果是整数,则表示方法和原码一样;如果是负数,则将数字的反码加上1(相当于将原码数值位取反然后在最低位加1)
6:00000110-6:11111010
移码
将补码符号位取反
6:10000110-6:01111010
左移
当数值左、右移时,先将数值转化为其补码形式,移完后,再转换成对应的原码
高位丢弃,低位补零
[+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的无符号右移
Java的左移
左移不区分有符号和无符号,都是左移之后右边补上0,最左边的符号位也直接移走
