一、原码 反码 补码
原码:直接用二进制表示数字
反码:正数的反码就是其本身,负数的反码为除开符号位其余全部取反
补码:正数的补码就是其本身,负数的补码在反码基础上+1(补码存在的意义就是将减法变成加法,并且使符号位也参与运算)
例如,模24的情况下:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23(无符号)
0 1 2 3 4 5 6 7 8 9 10 11 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1(有符号)
可以看出,为了表示负数,牺牲了一半的空间用来表示负数。
我们知道,在负数情况下,反码是除开符号位对原码进行取反,那么数值位原码+补码一定等于全1,即2^n-1.
比如-3,怎么转成补码呢?首先,数值部分为3,反码数值部分+原码数值部分=12-1,则反码数值部分等于8,补码等于反码+1=9,且补码前面的符号位所表示的数值大小为12,则补码的总值等于12+9=21,对照上面的两行表,恰好是-3的位置。
比如:
9-3
=9+(-3) //减法变加法
=9+21 //符号位参与运算,转换为补码,那么-3在值上应该是表示21
=30%24 //计算机中由于存储空间长度受限,溢出会舍弃,天然取余
=6
后续会持续更新