Да, в зависимости от того, что я вижу, если класс C (до 2^31 комбинаций), насколько вы можете идти, было бы неплохо предположить, что подписанный int является вашей проблемой (предполагая, конечно, int 32 бит на вашей машине)
Однако переключение на использование неподписанных цепей должно в достаточной мере справиться с этим. Однако, по-видимому, разные классы имеют маски, которые необходимо применять (http://www.vlsm-calc.net/ipclasses.php), так что idk, если это предполагается принять во внимание.
Кроме того, поскольку все IPv4 IP-адреса являются только 4-байтовые числа, я предлагаю еще один быстрый и грязный способ вычислить это, ваш призыв использовать очень, но это сделало бы маскировка проще реализовать, если вам нужно:
unsigned int calculate_available_ips(int r_start[4], int r_end[4])
{
unsigned int ip1 = r_start[0] << 24 | r_start[1] << 16 | r_start[2] << 8 | r_start[3];
unsigned int ip2 = r_end[0] << 24 | r_end[1] << 16 | r_end[2] << 8 | r_end[3];
if (ip1 > ip2) {
return ip1 - ip2 + 1;
}
return ip2 - ip1 + 1;
}
Естественная маскировка будет выполняться путем использования операции бит в uint. В качестве примечания, чтобы распечатать значение без знака, используйте %u
вместо %d
.
Помните, что 'int' является * signed * и что целые литералы (например,' 256') имеют тип 'int', если они не имеют суффикса с спецификатором. –
Я действительно думал, что Интернет основан сегодня в бесклассовой междоменной маршрутизации – Amadeus