two’s complement
最近得到一本《深入理解计算机》(Computer Systems A Programmers Perspective 3rd
),读到2.2章整数表示,对补码有了新的思考,为此记下一些思考与感悟。
依稀记得在大学讲解整数编码表示时会按照以下顺序介绍
- 原码 (sign magnitude)
- 反码 (ones’ complement)
- 补码 (2’s complement)
这次打算抛开原码与反码,直接从映射的角度去思考整数编码的问题。
计算机能识别的数据是二进制,对于相同的二进制,不同编码可以得到不同的解释。
例如,对于相同的四位二进制,可解释为无符号整数和有符号整数。
咱们逐个分析,先考虑二进制转无符号整数
。从一一映射的角度去思考。
- 从
0000
开始对应十进制的0
。 - 二进制加1,十进制也对应加1
0000
->0
0001
->1
0010
->2
0011
->3
0100
->4
0101
->5
0110
->6
0111
->7
1000
->8
1001
->9
1010
->10
1011
->11
1100
->12
1101
->13
1110
->14
1111
->15
这样看来二进制转无符号整数
本质上就是进制转换。
再一起看看二进制转有符号整数
。考虑到符号问题,用二进制最左边的数字来判断符号,0
表示正数,1
表示复数。
- 从
0000
开始对应十进制的0
。 - 二进制加1,十进制也对应加1
0000
->0
0001
->1
0010
->2
0011
->3
0100
->4
0101
->5
0110
->6
0111
->7
- 继续
0000
开始对应十进制的0
。 - 二进制减1,十进制也对应减1,对于二进制
0000 - 1
看作是10000 - 1 = 1111
。 0000
->0
1111
->-1
1110
->-2
1101
->-3
1100
->-4
1011
->-5
1010
->-6
1001
->-7
1000
->-8
这样也能做到一一映射的关系。上面的二进制,就是对应有符号整数的补码。
怎么去记忆和对应这个关系呢?
首先,思考四位二进制表示的有符号数的范围大小是[-8,7]
。
然后,我们把这个写在一个数轴上,然后再掰弯,让其收尾相连。
- 同样从
0000
开始对应十进制的0
。 - 二进制加1,十进制也对应加1
0000
->0
0001
->1
- ….
0111
->7
- 再往下添加1 就是负数,正好接上最小的数
1000
->-8
1001
->-7
- …
1111
->-1
最后,回到一开始的图,把所有的无符号数和有符号数连在一起看。
思考几秒钟。想想有符号数与无符号数以及二进制的关系。
更多精彩欢迎关注微信公众号