原码是什么?
反码是什么?
补码是什么?
原码:
正数:正数转换为二进制位就是这个正数的原码
负数:负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码
int 2 原码:
00000000 00000000 00000000 00000010
int -2 原码:
10000000 00000000 00000000 00000010
00000000 00000000 00000000 00000011 # 3原码
10000000 00000000 00000000 00000011 # -3原码
反码:
正数的反码就是原码
负数的反码等于原码除符号位以外所有的位取反
00000000 00000000 00000000 00000011 #3反码
11111111 11111111 11111111 11111100 # -3反码
补码:
正数的补码与原码相同,
负数的补码为 其原码的反码,然后最低位加1
00000000 00000000 00000000 00000011 #3补码
11111111 11111111 11111111 11111101 # -3反码
总结:
正数的原码, 反码, 补码 都一样.
负数的原码, 反码, 补码 都不一样.
符号位 + 二进制位
int -1的原码,反码,补码:
10000000 00000000 00000000 00000001
11111111 11111111 11111111 11111110
11111111 11111111 11111111 11111111
位运算:
正数有符号右移: 高位通通补0
负数有符号右移: 换算成补码后右移,高位通通补1
无符号右移: 无论正数,负数, 高位通通补0, 所以出现负数变成正数, 依然是补码运算,只是高位补0.
-1 >> 1 # -1
-1 >>> 32 # -1
-1 >>> 31 # 1