要想对程序的运行机制形成一个大致印象,就要了解信息在计算机内部是以怎样的形势来表现的,又是以怎样的方式进行运算的。那想必大家一定好奇数据与二进制之间能有什么联系。这篇文章将会围绕二进制怎样表示数据以及为什么用二进制表示进行叙说。废话不多说,下面就让我为大家解释谜团吧。
想必大家都知道计算机内部是由IC这种电子部件构成的。我们前面一篇提到的CPU(微处理器)和内存也是IC的一种。IC多种多样,有的像一条黑色的蜈蚣。在其两侧有数个乃至数百个引脚;有的则像插花用的针盘,引脚在IC内部并排排列着。但是呢IC的引脚只能表示两个状态,一个是直流电压的0V,一个是直流电压的5V。它的这个特性,也决定了计算机的数据只能用二进制数来处理。计算机所处理的信息基本单位是8位二进制,所以二进制的位数一般是8的倍数。8位二进制数被称为一个字节。字节是最基本的信息计量单位;位是最小的单位;字节是基本单位。内存和磁盘都是使用字节单位来存储和读写数据,使用位单位则无法读写数据。
接下来介绍一下运算吧,和十进制数一样,四则运算同样也可以使用在二进制数中,只要注意逢2进位即可。什么是移位运算呢?它指的是将二进制数值的各数位进行左右移位(shift=移位)的运算。移位有左移(向高位方向)和右移(向低位方向)两种。在一次运算中,可以进行多个位数移位操作。其中右移可以用来填充右移后空出来的高位的数值,有0和1两种形式。要想区分两种,则需要掌握用二进制数表示负数的方法即可。二进制数表示负数值时,一般会把最高位作为符号来使用,因此我们把最高位称为符号位。符号位是0时表示正数,相反是1时表示负数。计算机在做减法运算时,实际上内部在做加法运算。反之亦然。所以在表示负数时就需要使用“二进制的补数”。补数就是用正数来表示负数,非常amazing吧。
编程语言包含的整数数据类型中,有的可以处理负数,有的则不能处理。例如,C语言的数据类型中,既有不能处理负数的unsigned short类型,也有能处理负数的short类型。这两种类型,都是2字节(=16位)的变量,都能表示2的 16次幂=65536种值,这一点是相同的。不过,值的范围有所不同,short类型是-32768~32767unsigned short类型是0~65535。此外,short类型和unsigned short类型的另一个不同点在于,short类型是将最高位为1的数值看作补数,而 unsigned short类型则是32768以上的值。仔细思考一下补数的机制,大家就会明白像-3276832767这样负数比正数多一个的原因了。最高位是0的正数,有032767共32768个,这其中也包含0。最高位是1的负数,有-1~-32768共32768个,这其中不包含0。也就是说,0包含在正数范围内、所以负数就要比正数多1个。虽然0不是正数,但考虑到符号位,就将其划分到了正数中。
大家听到逻辑这个词可能会感觉有些难,但实际上它很简单。在运算中,与逻辑相对的术语是算术。我们不妨这样考虑,将二进制数表示的信息作为四则运算的数值来处理就是算术。而像图形模式那样,将数值处理为单纯的0和1的罗列就是逻辑。算术运算是指加减乘除四则运算。逻辑运算是指对二进制数各数字位的0和!分别进行处理的运算,包括逻辑非(NOT运算)、逻辑与(AND运算)、逻辑或(OR运算)和逻辑异(XOR运算)四种。逻辑非指的是0变成1、1变成0的取反操作。逻辑与指的是“两个都是1”时,运算结果为1,其他情况下运算结果都为0的运算。逻辑或指的是“至少有一方是1”时,运算结果为1,其他情况下运算结果都是0的运算。逻辑异或指的是排斥相同数值的运算。“两个数值不同",也就是说,当“其中一方是1,另一方是0”时运算结果是1,其他情况下结果都是0。不管是几位的二进制数,在进行逻辑运算时,都是对相对应的各数位分别进行运算。如果将二进制数的0作为假(false)、1作为真(true)来考虑,逻辑运算也可以被认为是真假的运算。真和真的AND运算结果为真,实际上也确实如此。因为如果两方面都是真,答案就是真。