/*****************************************************************************/
/* div32.c */
/* */
/* A program to divide one 32-bit signed binary number by another. */
/* */
/* Usage: div32 */
/* */
/* Will divide 10 sets of numbers, and print out the results. */
/* */
/*****************************************************************************/
/************/
/* INCLUDES */
/************/
#include <stdio.h>
/***********/
/* DEFINES */
/***********/
#define ERROR -1
#define SUCCESS 0
#define TESTS 10
/***********************/
/* FUNCTION PROTOTYPES */
/***********************/
int div32 (long dividend, long divisor, long *quotient, long *remainder);
/************************/
/* FUNCTION DEFINITIONS */
/************************/
int main()
{
/*
* Will test the following:
*
* Divide by 0: 1 / 0
* Divide positive by negative: 9 / -4
* Divide negative by positive: -9 / 4
* Divide negative by negative: -9 / -4
* Use max as dividend: 2147483647 / 4
* Use max as divisor: 4 / 2147483647
* Use min as dividend: -2147483648 / 4
* Use min as divisor: 4 / -214783648
* Divide by 1: 4 / 1
* Divide by -1: 4 / -1
*/
long dividend[TESTS] =
{
1, 9, -9, -9, 2147483647, 4, 0x80000000, 4, 4, 4
};
long divisor[TESTS] =
{
0, -4, 4, -4, 4, 2147483647, 4, 0x80000000, 1, -1
};
long quotient, remainder;
int result, i;
for (i = 0; i < TESTS; ++i)
{
printf("%d divided by %d ", dividend[i], divisor[i]);
/* Divide the two numbers */
result = div32 (dividend[i], divisor[i], "ient, &remainder);
if (result == ERROR)
{
printf("gives an error\n");
}
else
{
printf("is %d remainder %d\n", quotient, remainder);
}
}
return 0;
}
/*****************************************************************************/
/* div32() */
/* */
/* Divide one 32-bit number by another */
/* */
/* Input: dividend - the number to divide */
/* divisor - the number to divide by */
/* Output: quotient - the result of the division */
/* remainder - what remains after the division */
/* */
/* Return Value: ERROR - division by zero attempted. */
/* SUCCESS - the division worked. */
/*****************************************************************************/
int div32(long dividend, long divisor, long *quotient, long *remainder)
{
int shifts, i, dividend_sign, divisor_sign;
/* Check for divide by zero or 0x80000000 */
if (divisor == 0 || divisor == 0x80000000 || dividend == 0x80000000)
{
return ERROR;
}
/* Check and remove signs from dividend and divisor */
dividend_sign = 0;
divisor_sign = 0;
if (dividend < 0) {
dividend_sign = 1;
dividend = -dividend;
}
if (divisor < 0) {
divisor_sign = 1;
divisor = -divisor;
}
/* Initialization */
shifts = 0;
*remainder = dividend;
*quotient = 0;
/* Shift divisor until most significant bit is set */
while ((divisor & 0x40000000) != 0x40000000) {
divisor = divisor << 1;
++shifts;
}
/* Subtract and shift loop */
for (i = 0; i <= shifts; ++i)
{
*quotient = *quotient << 1;
if (*remainder - divisor >= 0)
{
*remainder -= divisor;
*quotient += 1;
}
divisor = divisor >> 1;
}
/* Put the correct sign on the result */
if (divisor_sign ^ dividend_sign)
{
*quotient = -*quotient;
}
if (dividend_sign)
{
*remainder = -*remainder;
}
return SUCCESS;
}