51单片机c语言计算两个unsigned int型数据的乘积结果髙两位溢出丢失(乘积的数据类型是unsigned long)
你把其中一个变量先放进 长整形变量中(数据类型是unsigned long), 就不会出现结果是整形了
mcs51系列单片机在进行乘除法运算时如何判断结果是否溢出?
乘法时不存在溢出,因其积是放在两个寄存器当中,8位乘8位,积不超过16位。
51单片机的溢出问题
一个字节只有8位,最大数是1111 1111,+0时不会产生溢出,所以标志位OV=0,当最高位的运算产生进位或借位时OV=1,在编程时,当加法或减法时,并不确定所得的结果是什么,每次需要检查OV位的值用相应的程序去处理有借位和进位的不同情况。如单字节运算中,寄存器中已是1111 1111,加立即值1结果还放在寄存器中,则寄存器中的值加法后变为0000 0000,但OV被置位=1,此时只要检查OV值,如果为1就将另一个寄存器中的值+1,如果这个寄存顺加后OV值又成为1则再另个寄存器中加1,按照所用的字节数,不断检查,就可以进行多个字节的加法运算。简单单片机的指令最多给出4个字节的加法运算指令,但可以用这种方法扩展为20个字节的加法运算,甚至更多,条件是片内的RAM够用。
C语言乘法计算溢出
(1)先做除法在做乘法,
(2)扩大定义范围如double
double a,b,c;
c=a*b/100.0;
a*b是超过4294967295的,但是a*b/100是绝对不超过4294967295
所以先做除法在做乘法就行了a/100*b,你可以定义成double类型
double 和 float 的区别是double精度高,有效数字16位
double a,b,c;c=a*b/100.0;
单片机中乘法指令溢出
请注意
在51中,乘法指令MUL
AB
是这样子的
将累加器的值与B寄存器的值相乘,乘积的低位字节存回累加器,高位字节存回B寄存器
说明:将累加器A和寄存器B内的无符号整数相乘,产生16位的积,低位字节存入A,高位字节存入B寄存器。如果积大于FFH,则溢出标志位(OV)被设定为1,而进位标志位为0
这里的溢出是对8位数来说的,