一:在编程语言提供的整数类型“中,有些可以处理负数,有些不能处理负数。例如,C语言的数据类型中,有不能处理负数的 unsignedshort 型,也有能处理负数的short 型。这两种类型的变量长度都是2字节(=16 比特),都能表示2的16次幂 =65536种不同的值。但是,它们能表示的值的范围不同,short 型是 -32768~32767,而 unsignedshort 型是0~65535。这是因为 short 型将最高位1的值按照2的补码来处理,而 unsigned short 型则将其作为32768以上的正数来处理。
认真思考2的补码的原理,我们就可以理解为什么在-32768~32767这个范围中,负数比正数要多一个。这是因为最高位为0的数有
0~32767,共32768 个,其中已经包含了0,而最高位1的数都是负数,即-!~-32768,也是32768个,其中不包含0。也就是说,由于0被包含在正数的范围内,所以负数比正数要多一个。尽管0不是正数,但从符号位的角度来看,它和正数属于同一类。
二:刚才我们讲逻辑右移的时候提到了“逻辑”这个词。有的读逻辑就觉得有点难了,其实它很简单。在运算中,“逻辑”是与相对的概念。
我们可以这样认为:将二进制数所表示的信息当作!算中的数值来处理就是算术,而像图案这样,将其当作单纯由组成的序列来处理就是逻辑。
逻辑非就是将0反转为1,将1反转为0。逻辑与就是在两者都为
1时运算结果为1,否则运算结果0。逻辑或就是在至少有一方为1时运算结果为1,否则运算结果为0。逻辑异或是一种排他的,也就是不喜欢对方和自己相同的运算,当两者不同,即一方为1,一方为0时,运算结果为1,否则运算结果为0。对多位二进制数进行逻辑运算,就是对相应的每一位进行运算。
表2-1 至表2-4中大家整理了逻辑运算的结果。这类表称为真值表(tmruth table )。如果我们让二进制的0表示假(FALSE),让1表示真(TRUE),那么逻辑运算也可以认为是一种决定真假的运算。“真”和“真”的逻辑与运算的结果是“真”,这也符合常识,因为双方都是真的话,结果一定是真。