📄 div_cal2.c
字号:
#include <intrins.h>
#include <string.h>
#include <absacc.h>
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/*--------------------------------------------------------------
超长除法(6字节(高位在前,低位在后)/整形数据==2字节)(四舍五入)
入口参数:
buf == 被除数
divisor == 除数
resulf_buf == buf/divisor
--------------------------------------------------------------*/
void ulong_div_uint(uchar *buf,uint divisor,uchar *result_buf)
{
ulong dividend1;
uint divisor1,residue1;
uint dividend2;
uchar divisor2,residue2;
uchar i;
if(*((uchar *)(&divisor)+0)==0) //除以字节数据
{
divisor2=*((uchar *)(&divisor)+1);
*((uchar *)(÷nd2)+0)=0; //被除数高位清0
*((uchar *)(÷nd2)+1)=buf[0];
result_buf[0]=dividend2/divisor2;
i=1;
do
{
residue2=dividend2%divisor2;
*((uchar *)(÷nd2)+0)=residue2; //余数作为下次高位
*((uchar *)(÷nd2)+1)=buf[i];
result_buf[i]=dividend2/divisor2;
i++;
}while(i!=6);
residue2 = dividend2%divisor2;
i=0;
if(residue2>(divisor2/2-1)) i=1;
}
else
{
divisor1=divisor;
*((uchar *)(÷nd1)+0)=0; //被除数高位清0
*((uchar *)(÷nd1)+1)=0;
*((uchar *)(÷nd1)+2)=buf[0];
*((uchar *)(÷nd1)+3)=buf[1];
result_buf[0]=0;
result_buf[1]=dividend1/divisor1;
i=2;
do
{
residue1=dividend1%divisor1;
*((uchar *)(÷nd1)+0)=0;
*((uchar *)(÷nd1)+1)=*((uchar *)(&residue1)+0); //余数作为下次高位
*((uchar *)(÷nd1)+2)=*((uchar *)(&residue1)+1);
*((uchar *)(÷nd1)+3)=buf[i];
result_buf[i]=dividend1/divisor1;
i++;
}while(i!=6);
i=0;
residue1 = dividend1%divisor1;
if(residue1>(divisor1/2-1)) i=1;
}
if(i)
{
result_buf[5]++;
if(!result_buf[5])
{
result_buf[4]++;
if(!result_buf[4])
{
result_buf[3]++;
if(!result_buf[3])
{
result_buf[2]++;
if(!result_buf[2])
{
result_buf[1]++;
if(!result_buf[1]) result_buf[0]++;
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -