基于proteus的51单片机仿真实例十九、用单片机端口演示数据的乘法运算结果

1、数据类型之间的转换
在C语言程序的表达式或变量赋值运算中,有时会出现运算对象的数据不一致的情况。C语言允许任何标准数据类型之间的隐式转换。所谓隐式转换是指系统会自动对相关数据类型进行转换,不需要强制干预。
隐式转换按以下从左到右的优先级自动进行:
bit-char-int-long-float
对于有符号和无符号型数据,无符号型数据的优先级大于有符号型数据:unsigned>signed
 
隐式数据转换时,低优先级的数据类型转为高优先级的数据类型,不一定非要按照上面的顺序逐级转换,可以隔级转换,例如将bit型赋值给int型变量时,bit型数据直接转换为int型,而不是先将bit型转换为char型,然后再转换为int型,
 
2、一般来说,如果有几个不同类型的数据同时参加运算,先将低级别类型的数据转换成高级别类型数据,再做运算处理,并且运算结果为高级别类型数据。
C语言除了能对数据类型作自动的隐式转换之外,还可以采用强制类型转换符“()”对数据类型做显式的人为转换。
 
3、本节通过两个实例来认识一下数据类型的隐式转换和强制转换。
首先实现数据类型的隐式转换。
 
4、在keil c51中新建项目ex7,输入以下程序代码,并编译生成ex7.hex文件。本实例实现一个无符号字符型变量和一个无符号整型变量相乘,然后用P0口显示乘积的低8位结果,P1口显示乘积的高8位结果。
//实例7:利用P0,P1口显示两数相乘的结果
#include <reg51.h>    //包含头文件
void main(void)
{
  unsigned char num1;    //定义无符号字符型变量 
 unsigned int num2,mul;   //定义无符号整型变量
 num1 = 22;     // 变量赋初值
 num2 = 33;
 mul = num1 * num2;  // 求两数相乘的结果
       //
 P0 = mul % 256;   //低8位送P0口
 P1 = mul / 256;   //高8位送P1口
 while(1)     //
 {
 }
}
5、在proteus中创建名称为ex7.dsn的仿真文件,电路图如下图所示,在at89c51中载入上一步生成的ex7.hex文件。

 基于proteus的51单片机仿真实例十九、用单片机端口演示数据的乘法运算结果
6、启动仿真,观察运行结果,然后与计算结果相对比,检查运行结果是否正确。如下图所示
基于proteus的51单片机仿真实例十九、用单片机端口演示数据的乘法运算结果
 
7、本例演示数据强制转换的运算结果,在本例中,定义了两个无符号整型数据,将这两数相乘后强制转换为无符号字符型数据。并通过P0口将运算结果显示出来
在keil c51中创建新工程ex8,编写如下程序代码,编译并生成ex8.hex文件。
   //实例87:利用P0,P1口显示两数相乘的结果 数据的强制转换
#include <reg51.h>    //包含头文件
void main(void)
{
  unsigned char mul;    //定义无符号字符型变量 
 unsigned int num2,num1;   //定义无符号整型变量
 num1 = 22;     // 变量赋初值
 num2 = 33;
 mul = (unsigned char)(num1 * num2);  // 求两数相乘的结果
       //
 P0 = mul;   //低8位送P0口
 
 while(1)     //
 {
 }
}
8、在proteus中创建仿真文件ex8。电路图如下图所示,将上一步生成的ex8.hex文件载入at89c51中
 
基于proteus的51单片机仿真实例十九、用单片机端口演示数据的乘法运算结果
 
9、启动仿真,观察运行结果,如下图所示,并与运算结果相对照,检查结果的正确性
基于proteus的51单片机仿真实例十九、用单片机端口演示数据的乘法运算结果