二进制编码
众所周知,现代计算机都是用 0 和 1 组成的二进制来表示所有的信息,因此二进制的重要性不言而喻。无论是十进制还是二进制,它们的区别并不大。十进制是逢十进一,用 0 ~ 9 这是十个数字来表示;而二进制则是逢二进一,用 0 和 1 这两个数字表示。
十进制整数的二进制表示
任何一个十进制的整数通过短除法可以转换为二进制表示。短除法过程:
- 把十进制的数除以 2 的余数,作为最右边的一位。
- 用商继续除以 2,把对应的余数紧靠刚才余数的右侧,如此递归,直到商为 0 即可。
以 13 这个数举例,来看一下如何通过短除法来转换成二进制数:
最终得到十进制数 13 对应的二进制数 1101。
原码表示
前面举的例子是整数的,如果是负数应该如何表示?假设最左侧的一位对应正负号,0 为正数,1 为负数。那么一个 4 为的二进制数 0011 表示 +3,而 1011 则表示 -3,这就是整数的原码表示法。
补码表示
原码表示有一个问题,就是 0 可以用两个不同的编码来表示,1000 表示 0,而 0000 也代表 0。而使用补码来表示的话,可以解决这个问题。
补码的概念:
- 正数的补码与原码本身相同。以十进制数 3 举例,它的二进制表示为 0011,它的补码也是 0011。
- 零的补码也与本身相同,即 0000。
- 负数的补码是它正数形式的二进制表示取反后加 1。以十进制数 -3 举例,它正数形式的二进制为 0011,取反之后得到 1100,再加 1 变成 1101。
使用补码来表示的时候,我们仍然通过最左侧第一位的 0 和 1 来判断这个数的正负,但是不再把这一位当做单独的符号。当在做计算的时候,如果最左侧第一位为 1 的时候,则在左侧最高位前面加个负号。
以四位二进 1101 制表示 -3:
经过前面的了解,我们知道通过原码跟补码进行表示的区别。通过补码表示,四位二进制可以表示 -8~7 这 16 个正数,并不会有原码有两个二进制数表示 0 的问题。
补码除了解决原码会有两个数表示 0 的问题之外,还使得整数相加变得很容易,不需要做任何特殊处理,只要把它当成普通的二进制相加就能得到正确的结果。