从单片机基础到程序框架(全集 2019pdf版).pdf - 第85页
二进制:0 第 3 个数 十进制:1 十六进制:1 二进制:1 第 4 个数 十进制:3 十六进制:3 二进制:11 第 5 个数 十进制:3 十六进制:3 二进制:11 分析: 通过实验结 果,发现 在单片机上的 计算结果和 我们的分 析是一致的。 【19.3 如何在单片机上练习本章节 C 语言程序?】 直接复制前 面章节中第十 一节的模板程 序, 练习代码时只需 要更改 “ C 语言学习区 域” 的 代码就可 以了, 其它 部分的 …

现在我们编写一个程序来验证上面讲到的例子:
程序代码如下:
/*---C 语言学习区域的开始。-----------------------------------------------*/
void main() //主函数
{
unsigned char a; //一个字节
unsigned char b=0xff; //一个字节
unsigned char c=0xff; //一个字节
unsigned int d=0xfffe; //两个字节
unsigned long e=0xfffffffe; //四个字节
a=0x8536;
b=b+1;
c=c+2;
d=d+5;
e=e+5;
View(a); //把第 1 个数 a 发送到电脑端的串口助手软件上观察。
View(b); //把第 2 个数 b 发送到电脑端的串口助手软件上观察。
View(c); //把第 3 个数 c 发送到电脑端的串口助手软件上观察。
View(d); //把第 4 个数 d 发送到电脑端的串口助手软件上观察。
View(e); //把第 5 个数 e 发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第 1 个数
十进制:54
十六进制:36
二进制:110110
第 2 个数
十进制:0
十六进制:0

二进制:0
第 3 个数
十进制:1
十六进制:1
二进制:1
第 4 个数
十进制:3
十六进制:3
二进制:11
第 5 个数
十进制:3
十六进制:3
二进制:11
分析:
通过实验结果,发现在单片机上的计算结果和我们的分析是一致的。
【19.3 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第二十节:隐藏中间变量为何物?
【20.1 隐藏中间变量为何物?】
“隐藏中间变量”虽然视之不见摸之不着,但是像空气一样无处不在。它有什么规律,是什么类型,数
值范围是多大,研究它有什么实用价值?这就是本节要解开之谜。
前面章节提到,两个加数相加,其结果暂时先保存在一个“隐藏中间变量”里,运算结束后才把这个“隐
藏中间变量”赋值给左边的“保存变量”。这里的“隐藏中间变量”到底是 unsigned int 类型还是 unsigned
long 类型?为了研究它的规律,我在 keil 自带的 C51 编译环境下,专门编写了几个测试程序来观察实际运行
的结果。
“保存变量”=“加数 1”+“加数 2”;
下面分别变换“保存变量”、“加数 1”、“加数 2”这三个元素的数据类型,来观察“隐藏中间变量”背
后的秘密。
(1)“unsigned int”=“unsigned char”+“unsigned char”;
unsigned int a;
unsigned char x1=0x12;
unsigned char y1=0xfe;
a=x1+y1;
运算结果:a 等于 0x0110。
分析过程:两个 char 类型的数相加其运算结果暂时保存在“隐藏中间变量”,当运算结果大于两个“加
数”unsigned char 本身时,并没有发生溢出现象,unsigned int 类型的“保存变量”a 最终得到了完整的
结果 0x0110。
初步结论:这种情况,“隐藏中间变量”估计为 unsigned int 类型。
(2)“unsigned long”=“unsigned int”+“unsigned char”;
unsigned long b;
unsigned int x2=0xfffe;
unsigned char y2=0x12;
b=x2+y2;
运算结果:b 等于十六进制的 0x0010。
分析过程:一个 unsigned int 类型的数与一个 unsigned char 类型的数相加,当运算结果大于其中最
大加数 unsigned int 类型本身时,因为左边的“保存变量”本来就是 unsigned long 类型,所以我本来以
为运算结果应该是 unsigned long 类型的 0x00010010,但是实际结果出乎我的意料,最终结果是 unsigned int
类型的 0x0010,显然发生了溢出现象。
初步结论:这种情况,“隐藏中间变量”估计为 unsigned int 类型。
(3)“unsigned long”=“常量”+“常量”;
unsigned long c;
c=50000+50000;
运算结果:c 等于 100000。
分析过程:unsigned int 的最大数据范围是 65535,而两个常量相加,其结果超过了 65535 却还能完
整保存下来。
初步结论:这种右边加数都是常量的情况下,“隐藏中间变量”估计等于左边的“保存变量”类型。