目录
什么是二进制
X进制指的就是以多少为基数和进制的数学表达方式算法。二进制数据是用0和1来表示的数,进位规则“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。比如:
0[0000],1[0001],2[0010],3[0011],4[0100]...
计算机系统中的二进制
在计算机系统中,是约定采用带符号的二进制,最高位的一位代表正负符号位。首先有以下几个概念,本文都以一字节8位的二进制为例:
原码
原码很好理解,最高位0代表正数,1代表负数,例如:1 的原码 = 00000001 -1的原码 = 10000001 。在原码参与计算时,正数之间的加法结果是不会有问题,而正数与负数相加,或负数与负数相加,就会有莫名其妙的结果,这都是符号位引起的。要解决这个问题,在运算时首先要考虑符号位,这就非常不便。
反码
由于计算机系统只存在加法,而1 - 1 === 1 +(-1)按原码进行计算会被表达为:
00000001 + 10000001,最终的运算结果为-2,显然不对。为了解决这个问题,反码出现了。
约定:正数的反码和原码一样,负数的反码是对原码除符号位外进行取反。
例如 :1 的反码 =00000001 -1 的反码 = 11111110
补码
按反码进行计算,1 - 1 === 1 +(-1)会被表达为00000001+11111110=11111111取反=10000000=-0,在反码中会存在对+0和-0的两种表达,这个时候补码出现。
约定:补码是在反码的基础上再次进行转化,正数的原码 、 反码、补码都一样,负数的补码是在反码的基础上 +1 。
例如:-1的补码 = 反码11111110 + 1 = 11111111。
1 - 1 === 1 +(-1)按补码进行计算会被表达为:
00000001 + 11111111 = 00000000(最高位溢出被丢弃)
补码运算其实是一种数值有限制、有溢出的模运算,也就是说在这种运算规则下,减去一个数其实相当于加上这个数的同余数。这就好比12进制的时钟,11-1=10点,11+11=22在时间表达上也是10点。
为什么负数的补码的求法是反码+1
负数的补码等于反码+1并不是补码的定义,只是负数补码正好就等于反码+1而已。求补码并不一定要先求反码,如果有兴趣了解补码的详细原理,建议阅读《计算机组成原理》,里面以“模”和“同余”的概念解释补码。
负数的反码加上这个负数的绝对值(符号为正)正好等于11111111,在加1就是100000000,也就是8位二进数的模,而负数的补码是它的绝对值的同余数,可以通过模减去负数的绝对值得到它的补码,所以负数的补码就是它的反码+1。
因此基于以上,由于补码表示中的符号位可以与数值位一起参加运算,并且可以将减法转换为加法进行运算,简化了运算过程,计算机中的二进制都以补码的形式参与运算和存储。