整数表示

Posted by lamyoung on May 4, 2022

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

最后,回到一开始的图,把所有的无符号数和有符号数连在一起看。

思考几秒钟。想想有符号数与无符号数以及二进制的关系。

更多精彩欢迎关注微信公众号