因为数字计算机只有两种状态,开(1)和关(0),所以它们使用二进制(基数2)编码系统。读者们都是在10进制数字系统中长大的,所以二进制看起来有点不太适应。然而,理解基数为2的数字并不难。
请观察表3-2。你可以将位看作一小块数据,它只能假设两个值:1(开)或关(0),这与数字计算机的二进制性质一致。大多数中央处理器(CPU)将位组合成一个称为字节的实体。每个字节由8位组成。大多数编程语言开始用数字0而不是1来计数。因此,字节中的位以位0开始,以位7结束。因为8位字节的“高”位是第7位,用作“符号位”。例如,如果为字符数据类型启用第7位,则数字将被解释为负值。如果将第7位(即64到1)的所有值“向右”相加,则会发现它们的总和为127。如果查看表3-1中字符数据类型的范围,则会看到最大值为127。如果为字符启用位7,则解释这是一个负数,因此值变为-128。这将帮助你了解如何为不同的变量选择数据类型设置范围。对于无符号数据类型(例如,unsigned char、unsigned int、unsigned long),没有符号位,因此高位仅为正值。同样,这也解释了为什么无符号数的最大值大约是有符号数据类型的两倍。
现在,让我们更详细地检查表3-2。
表3-2 8位数据值的基数2解释
(www.xing528.com)
在表3-2中,你可以看到位位置如何对应于2的各种幂。例如,如果将值2提高到6次方,则结果值为64。如果你回忆起高中数学,任何升到0次方的数字都是1。从位0向左移动,可以看到值在移动到下一位位置时是如何加倍的。
问题是:如何形成二进制值?假设要形成十进制(以10为基数)值65。要创建该值,需要打开Bit0和Bit6。因为2的第0次方是1,2的第6次方是64,所以将这两个值相加得到65。那么,要得到5又如何操作?如果打开Bit0和Bit2,则得到值5(即00000101)。要得到10又是如何操作?在这种情况下,打开Bit3和Bit1(即00001010)。
由此看,似乎将所有位向左移动一个位置等同于将数字乘以2。同样,将所有位向右移动一个位置与除以2相同。这完全正确。Arduino C支持移位操作运算。你可能会在以后的一些代码中看到这方面的示例。稍后我们将对此有更多的讨论。移位运算仅适用于整型数据类型。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。