从单片机基础到程序框架(全集 2019pdf版).pdf - 第140页

第 1 个数 十进制:250 十六进制:F A 二进制:111 11010 第 2 个数 十进制:0 十六进制:0 二进制:0 第 3 个数 十进制:255 十六进制:F F 二进制:111 11111 第 4 个数 十进制:1 十六进制:1 二进制:1 分析: 通过实验结 果,发现在单 片机上的计算 结果和 我们的分析是 一致的。 【33.4 如何在单片机上练习本章节 C 语言程序?】 直接复制前 面章节中第十 一节的模板程 序, 练…

100%1 / 836
现在举一个完整的例子来分析“!”运算的规律。有两个 unsigned char 类型的十进制数分别是 5 0,
求!5 和!0 的结果分别是多少?分析思路如下
(a)针对 5 的“非”运算。
5 大于 0,是一个整体,被“非”后为 0.
(b)针对 0 的“非”运算。
0 就是 0,是一个整体,被“非”后为 1.
【33.3 例程练习和分析。
现在编写一个程序来验证刚才讲到的“按位取反”和“非”运算:
程序代码如下:
/*---C 语言学习区域的开始。-----------------------------------------------*/
void main() //主函
{
unsigned char a=5;
unsigned char b=5;
unsigned char c=0;
unsigned char d=0;
a=~a;
b=!b;
c=~c;
d=!d;
View(a); //把第 1 个数 a 发送到电脑端的串口助手软件上观察。
View(b); //把第 2 个数 b 发送到电脑端的串口助手软件上观察。
View(c); //把第 3 个数 c 发送到电脑端的串口助手软件上观察。
View(d); //把第 4 个数 d 发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
1 个数
十进制:250
十六进制:FA
二进制:11111010
2 个数
十进制:0
十六进制:0
二进制:0
3 个数
十进制:255
十六进制:FF
二进制:11111111
4 个数
十进制:1
十六进制:1
二进制:1
分析:
通过实验结果,发现在单片机上的计算结果和我们的分析是一致的。
【33.4 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改C 语言学习区域”代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口 51 习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。
第三十四节:移位运算的左移。
【34.1 “左移”运算。
“左移”运算也是以位为单位进行运算的。位是指二进制中的某一位,位只能是 0 或者 1。欲理解某个
“左移”运算的内部规律,必先把该数展开成二进制的格式,然后才好分析。“左移”运算的符号“<<”
它的通用格式如下:
“保存变量”=“被移数”<<n;
运算规律是“被移数”先被复制一份放到某个隐蔽的临时变(也称作寄存器然后对此临时变量展
开成二进制的格式,左边是高位右边是低位,此二进制格式的临时变量被整体由右往左移动了 n 原来
左边的高 n 位数据被直接覆盖,而右边由于数据位移动而新空出的 n 位数据被直接填 0,最后再把移位
运算的结果存入“保存变量”。多问一句,这行代码执行完毕后“保存变量”和“被移数”到底哪个变量发
生了变化,哪个变量维持不变?大家记住,只有赋值语句“=”边的“保存变量”发生数值变化,而右边
“被移数”没有发生变化,因为“被移数”被操作的不是它自己本身,而是它的复制品替身(某个隐蔽的
临时变量,也称寄存器。这条规律对“加、减、乘、除、与、或、异或、非、取反”等运算都是适用的
重要的事情再重复一次,这条规律就是:只有赋值语句“=”左边的“保存变量”发生数值变化,而赋值语
句“=”右边的“运算变量本身不会发生变化,因为“运算变量”被操作的不是它自己本身,而是它的
制品替身(某个隐蔽的临时变量,也称寄存器)
上述通用格式中的 n 代表被一次左移的位数,可以 0,当 n 等于 0 的时候,代表左移 0 位,其实就是
数值维持原来的样子没有发生变化。
现在举一个完整的例子来分析“<<”左移运算的规律。有两个 unsigned char 类型的变量 a b,它们
的数值都是十进制的 5,求 a=a<<1 b=b<<2 的结果分别是多少?分析步骤如下:
第一步:先把 a b 变量原来的数值以二进制的格式展开。十进制转二进制的方法请参考前面第 14,15,
16 节的内容。
a 变量是十进 5,它的二进制格式是: 00000101。
b 变量是十进 5,它的二进制格式是: 00000101。
第二步:将 a 左移 1 ,将 b 左移 2
(1)a=a<<1,就是将 a 左移 1 位。
a 左移前是 -> 00000101
a 左移 1 位后是 -> 00001010
结果分析:把二进制的 00001010 转换成十六进制是:0x0A。转换成十进制是 10。所以 a 初始值是
5,左移 1 位后的结果 10。
(2)b=b<<2,就是将 b 左移 2 位。
b 左移前是 -> 00000101
b 左移 2 位后是 -> 00010100
结果分析:把二进制的 00010100 转换成十六进制是:0x14。转换成十进制是 20。所以 b 初始值是
5,左移 2 位后的结果 20。
【34.2 “左移”与乘法的关系。
上面的例子仔细观察,发现一个规律:5 左移 1 位就变成了 10(相当 5 乘以 2),5 左移 2 位就变成