ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
【24.1 为什么要借用**unsigned long类型的中间变量?**】 为什么要借用unsigned long类型的中间变量进行算术运算?其实就是为了减少溢出的问题。溢出是因为数据超过了它的最大范围,unsigned char ,unsigned int ,unsigned long三种数据类型中,unsigned long的取值是最大的。当参与运算变量中存在非unsigned long类型的时候,在运算前,先让每个非unsigned long类型的变量借用一个unsigned long类型的中间变量,然后才开始运算,可以大大减少运算中的溢出问题。 unsigned long的取值是从0到4294967295,万一数据超过了4294967295怎么办?有两种办法,一种是换更加高级的32位单片机,比如STM32单片机就支持64位长度的“long long”数据类型,64位长度的数据类型基本上可以满足绝大多数涉及运算的项目,还有一种方法思路是可以用BCD码的数组方式进行运算,这种数组运算的方法我以后会跟大家介绍,初学者现在暂时不用深入了解它。 【24.2 如何借用unsigned long类型的中间变量?】 借用中间变量的方法是引入中间变量,有多少个非unsigned long类型变量就引入多少个unsigned long中间变量,再借这个“壳”进行运算,最后再把中间变量的计算结果返回给实际变量。请看下面例子。 转换之前: unsigned int a; unsigned char x=195; unsigned long y=101; a=x-y; //进行算术减法运算 分析: 上述公式用到3个变量,其中a和x都不是unsigned long变量,因此需要为它们分别引入两个unsigned long类型的中间变量t和s,于是乎,继续往下看...... 转换之后: unsigned int a; unsigned char x=195; unsigned long y=101; unsigned long t; //引入的中间变量t,用来给a借用。 unsigned long s; //引入的中间变量s,用来给x借用。 //第一步:使用之前先清零 t=0; //t在用之前,先把t的32位全部清零。 s=0; //s在用之前,先把s的32位全部清零。 s=x; //s接收x原数据,等效于x借用unsigned long中间变量s这个壳。 t=s-y; //此处unsigned long类型的t就默认代表了unsigned int类型的变量a。 //第二步:因为其它的变量都是临时的,所以运算结束后再返回计算结果给原来的变量。 a=t; //运算结束后再把计算结果返回给原来的变量a。 分析: 第一步:unsigned long类型的中间变量在转换之前为什么要先赋值0进行清零,比如上述代码的“s=0;”?因为它是32位的数据类型,它也是一个随机数,如果不清零,后续的其它类型的变量可能是16位或者8位的类型变量,这些宽度不一的变量在给32位的变量赋值的时候,只能覆盖到32位变量的低16位或者低8位,无法等效于实际借用者变量的数值,所以有可能会出错。 第二步:因为其它的变量都是临时的,所以运算结束后应该再返回计算结果给原来的实际变量。在这里要多说一句,实际项目中,最后接收运算结果的变量应该根据项目所需去选择它的类型,建议尽量选择unsigned long类型吧,否则,如果中间变量的计算结果大于接收变量本身的类型范围,也会发生溢出。比如,上述最后一行代码a=t,如果此时t的数值大于65535,a也会发生溢出的现象。 但是如果a本身是unsigned long 类型,就不会发生这种现象。 加法,乘法,除法在借用中间变量的时候,跟本节减法例子中的思路也大同小异。 【24.3 建议在算术运算中确保所有的变量都是unsigned long类型。】 不管是以前讲的加法,现在讲的减法,还是未来讲的乘法和除法,我都会建议“在加减乘除四则运算中,凡是非unsigned long类型的变量,都应该借用unsigned long类型的中间变量进行运算,最后再返回计算结果给实际的变量。”unsigned long变量是三种数据类型中取值范围最大的数,借用此类型的中间变量,可以减少在简单运算中可能出现的溢出问题。