从单片机基础到程序框架(全集 2019pdf版).pdf - 第156页
第 3 个数 十进制:171 十六进制:A B 二进制:101 01011 分析: 通过实验结 果,发现在单 片机上的实验 结果 和我们的分析 是一致的。 【37.5 如何在单片机上练习本章节 C 语言程序?】 直接复制前 面章节中第十 一节的模板程 序, 练习代码时只需要 更改 “ C 语言学习区 域” 的 代码就可 以了, 其它 部分的 代码 不要动 。编 译后 ,把程 序下 载进带 串口 的 51 学 习板, 通过 电脑 端的串 …

程序代码如下:
/*---C 语言学习区域的开始。-----------------------------------------------*/
void main() //主函数
{
unsigned long a=0x12345678; //多字节变量
unsigned long b=0x12345678;
unsigned long c=0x12345678;
unsigned char t=0xab; //单字节变量
a=t; //a 是 0x000000ab,其余高位默认被 0 覆盖。
b=0; //这是我以前用的办法,显得过于保守
b=t;
c=(unsigned long)t; //C 语言的类型强制转换。现在推荐大家用这种。
View(a); //把第 1 个数 a 发送到电脑端的串口助手软件上观察。
View(b); //把第 2 个数 b 发送到电脑端的串口助手软件上观察。
View(c); //把第 3 个数 c 发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第 1 个数
十进制:171
十六进制:AB
二进制:10101011
第 2 个数
十进制:171
十六进制:AB
二进制:10101011

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

第三十八节:第二种解决“运算过程中意外溢出”的便捷方法。
【38.1 意外溢出。】
运算过程中的意外溢出,稍不注意,就中招,不信,请看下面的例子:
/*---C 语言学习区域的开始。-----------------------------------------------*/
unsigned long a=0;
unsigned int x=1000;
unsigned int y=3000;
void main() //主函数
{
a=x*y; //猜猜 a 是多大?
View(a); //把第 1 个数 a 发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
猜猜 a 是多大?很多人以为理所当然 3000000,但是实际上是 50880!中招了吧。莫名其妙的 50880,就
是因为意外溢出所致。怎么办呢?请看下面介绍的两种解决办法。
【38.2 第一种办法:引入中间变量。】
我在前面章节中曾多次说过“为了避免运算过程中的意外溢出,建议大家把所有参与运算的变量都用
unsigned long 类型的变量,如果不是 unsigned long 类型的变量,就引入 unsigned long 类型的中间变量。”
这种老方法如下:
/*---C 语言学习区域的开始。-----------------------------------------------*/
unsigned long a=0;
unsigned int x=1000;
unsigned int y=3000;
unsigned long s; //引入的 unsigned long 中间变量。
unsigned long t; //引入的 unsigned long 中间变量。
void main() //主函数
{
s=x; //先把变量的数值搬到 unsigned long 中间变量。
t=y; //先把变量的数值搬到 unsigned long 中间变量。
a=s*t; //中间变量代表原始变量进行运算。
View(a); //把第 1 个数 a 发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
这一次,运算结果是正确的 3000000。