计算机中的数据实际上是一串二进制串,仅包含数字0和数字1。人们对于数字的直观理解来源其十进制数,对于为人们所熟悉的十进制的数来说,其加减乘除运算规则十分简洁且易于计算,正负数之间的运算法则也有其特定的方式,对于一个学过数学的人来说可谓手到擒来……但对于计算机来说,它并没有人类智慧的大脑,它甚至无法数出超过1的数字,它只认识数字0和数字1。因此,在计算机的世界里,人类社会中的很多规则是行不通的……
综述,要以灵活的思维去理解思考机器码,不能把十进制的规则往二进制上硬搬。在理解各种机器码时,要理解其产生的原因,有什么样的作用。当你理解了这套机器界的法则时,小小的01串能给你创造出无限的东西。这就相当于一个智商按指数增长的人,其增长的恐怖速度可见一斑,且上不封顶。
- 原码:
按照人们对于十进制的理解,直接转化为二进制后,即为原码。
特点:有符号位;+0和-0原码二进制表示不同
缺点:在计算负数加法时,结果出现错误。
如:13+(-14)=-1
13的二进制为:00001101
-14的二进制为:10001110
相加得:10011011 该数十进制为:-27
显然,结果出现错误。
- 反码
意识到原码的错误后,在引入补码之前,先引入了反码进行过渡。
特点:有符号位,+0和-0二进制表示不同。
表示:原码非符号位按位取反。
- 补码
补码的出现很好的解决了负数加法的问题,补码由同余引入。
思考钟表问题:12h为一圈。倘若现在是9点,问该进行怎样的操作才能到达1点。两种方案:1.时针顺时针旋转4个单位到达一点. 2.时针逆时针旋转8个单位到达1点.
即9+4=1或者9-8=1.
什么?9+4=1?连小学生都知道这是错误的,但是在引入同余这个概念后就很好理解了,钟表的一圈相当于一个周期(9+4)%12=1。13和1模12同余……
依次类推12和0同余、11和-1同余、10和-2同余……
不难发现,上面自然而然的引入了负数,因此对负数做加减操作,相当于对该负数同余的数做运算。补码正是基于这样的一种思维产生的,化负为正。
特点:有符号位;+0和-0的机器码一样(见下篇)
补码的出现,很好的解决了原码的问题。