上篇文章我们提到过在计算机中所有的文件底层的存储都是使用二进制的,右键点击一个文件然后点属性,我们可以看见该文件的大小,如:1.06 KB (1,094 字节)
这里我的文件大小为1094个字节,字节(byte)是电脑中的最小计量单位,上面依此是千字节Kb、兆字节Mb、吉字节Gb……1024b=1Kb;1024Kb=1Mb;1024Mb=1Gb,但是不管多大,其都是由一个个二进制数组成的。
那一个字节是由多少个二进制组成的呢?八位。
也就是说假如我们玩一个字节的话,十进制的1对应的是二进制的00000001;
1.符号位
其中最高位是符号位,0表示这个数是正数,1表示这个数是负数,后面7位表示该数的值。
也就是说 十进制的 3 对应二进制的数为:00000011,十进制的 -3 对应的二进制的数为:10000011
最高位只表示符号位,只表示该数到底是正数还是负数,不参与进行数值计算
那如果我们玩的是两个字节呢?那要表示十进制的-3,则是1000000 00000011
只要记住最高位是符号位,最高位的0表示该数是正数,1表示该数是负数即可。
2.原反补
我们可以使用十进制进行算术计算,比如3+2 结果等于5; 9-3结果等于6,同样,我们也可以使用二进制进行算术计算。
3+2的计算,我们先把十进制的3和十进制的2转成对应的2进制的数。分别是:
00000011
00000010
相加算后可知(1+0等于1,1+1 等于10)结果为00000101,这是二进制的结果,我们把这个数转成十进制看看到底是不是5呢?
2^2*1 + 2^1*0 + 2^0*1 = 5 上篇已经介绍过如果将二进制转成十进制,忘了的同学请自行翻到上篇回顾一下。
这样看起来结果正确,那么我们再用二进制计算一下9-3
9的二进制:00001001
3的二进制:00000011
一相减,发现结果等于00000110,验证一下发现没错,等于6.
但是!计算机当中是没有减法的,只有加法。
为什么没有减法只有加法呢?其实道理很简单,你想想假如让你制作一个机器,这个机器你制作成1个功能制作起来简单呢?还是做多个功能制作起来简单?不止是制作简单,还有功能多了是不是大小也不能那么精巧了?
那,计算机里只有加法的话,我非要计算减法的话,要怎么算呢?
其实,加法也可以实现,利用我们小学体育老师教导我们的数学知识得知,9-3可以转成9+(-3),这样就把减法转成了加法。
9的二进制: 00001001
-3的二进制:10000011
相加后的结果为:10001100,这明显不是6嘛,骗人。
是的,假如只有加法的话,那么直接使用二进制进行计算的话,是会导致结果出现问题,那么我们聪明的人类设计出了补码,只要用二进制的补码进行计算就没有问题。
之前我们学的的是称作二进制的原码,那我们如何把二进制原码转成补码呢?使用反码,反码是原码通向补码的桥梁
说了这么多抽象的文字,大家可能都晕了,没关系,看到下面的转换案例,马上清晰明了。
1.正数的原码反码补码一致
也就是说00111111 这样的正数,他的补码也是00111111
2.负数
2.1 负数的反码是符号位(最高位)不变,其他的0变1,1变0
2.2 负数的补码是反码+1
假如现在有个负数是 十进制的-27对应的二进制的原码为 10011011
那么根据反码规则,最高位不变,还是1,其他位0变1,1变0,成为11100100
最后,补码的规则是反码+1,也就是11100101
会算了吗?如果不会的话,可以自己找几个数练习练习。
那么回过头我们把之前的9-3再算算,这里补充个知识点,计算机中存储的都是二进制的补码,因为正数的原码反码补码一致,所以我们之前的计算拿原码拼命的计算也是一样的结果。但是我们心里得有个谱,计算是采用的补码。
9的二进制原码: 00001001
正数的原反补一致,所以
9的二进制补码: 00001001
-3的二进制原码:10000011
-3的二进制反码: 11111100 (最高位不变,其他的0变1,1变0)
-3的二进制补码: 11111101 (反码+1)
那我们应该是把9的补码和-3的补码相加进行计算,
9的二进制补码: 00001001
-3的二进制补码: 11111101
得到结果???不会算了?好像超了位数,没关系,你当做是水杯的只能装8L的水,但非要往里面倒9L的话,装不下的就装不下,只保留最后八位即可。
我们算下得到结果是1 00000110 最左边的那位装不下,于是我们就截取了剩余00000110,验证下结果为6,没错。
OK,到此我们已经掌握了符号位和原反补的知识,最后做几个练习巩固一下吧。
练习1:
默认一个字节,使用二进制进行计算29-73,(友情提示:补码和补码计算出来的结果仍为补码)