#define MAX_NUM_OF_DIGITS	10
#define MAX_VALUE_OF_INT	0x7fffffff
#define MIN_VALUE_OF_INT	-0x80000000

int reverse(int x)
{
	int digits[MAX_NUM_OF_DIGITS] = { 0 };
	int sign = x > 0 ? 1 : 0;
	unsigned abs = sign ? x : -x;
	unsigned max = sign ? MAX_VALUE_OF_INT : -MIN_VALUE_OF_INT;
	unsigned result = 0;
	int i = 0;
	int num_digits = 0;

	while (abs) {
		digits[i++] = abs % 10;
		abs /= 10;
	}
	num_digits = i;

	for (i = 0; i < num_digits && i < 9; i++)
		result = 10 * result + digits[i];

	if (num_digits == MAX_NUM_OF_DIGITS) {
		/* overflow for 32-bit signed int */
		if (result > max / 10 ||
		    (result == max / 10 && digits[9] > max % 10))
			return 0;
		else
			result = 10 * result + digits[i];
	}

	return sign ? result : -result;
}

References

[1] https://leetcode.com/problems/reverse-integer