ниже, когда любое из numA-D умножено много раз, число внезапно становится отрицательным. Например, когда numA умножается в 3 раза на 256, число становится отрицательным, но только если умножается только на 256 дважды. Цель этого проекта — изменить IP-адрес на длинный без знака, а затем длинный без знака на IP-адрес.
using namespace std;
unsigned long ip2long (string ipv4)
{
// variable to return
unsigned long rtn;
string A,B,C,D;
string delimiter = ".";
size_t position;/* must parse string by '.' character
and then assign (A,B,C,D) to the values
and return the unsigned long last, you don't have to make
the variables unsigned longs */int locOfA = ipv4.find('.' );
int locOfB = ipv4.find('.', locOfA + 1);
int locOfC = ipv4.find('.', locOfB + 1);
int locOfD = ipv4.find('.', locOfC + 1);A = ipv4.substr(0,locOfA);
B = ipv4.substr(locOfA + 1, locOfB - locOfA - 1);
C = ipv4.substr(locOfB + 1, locOfC - locOfB -1 );
D = ipv4.substr(locOfC + 1, locOfD - locOfC -1);
int numA = atoi(A.c_str());
int numB = atoi(B.c_str());
int numC = atoi(C.c_str());
int numD = atoi(D.c_str());
cout << endl;
cout << numA << endl;
cout << numB << endl;
cout << numC << endl;
cout << numD << endl;cout << endl;
// assigning a unsigned long to the sum of the algorithm
cout << (numA * 256 * 256) + << endl;
cout << (256 * 256 * 256 * numB) << endl;
cout << (256 * numC) << endl;
cout << (256 * numD) << endl;
rtn = numD + (256 * numC) + (256 * 256 * numB) + (256 * 256 * 256 * numA);return rtn;
}
unsigned long
без знака — не может быть отрицательным Но все ваши числа, и в результате все ваши расчеты, являются int
с не unsigned long
s. int
S могут быть отрицательными.
Другими словами, эта строка
rtn = numD + (256 * numC) + (256 * 256 * numB) + (256 * 256 * 256 * numA);
Такой же как
rtn = static_cast<unsigned long>(numD + (256 * numC) + (256 * 256 * numB) + (256 * 256 * 256 * numA));
Все переменные и константы int
и они не будут автоматически переведены в unsigned long.
int 32-битный. это означает, что его максимальное значение равно 2 ^ 31 = 256 * 256 * 256 * 128 — 1. (а его нижнее значение равно -2 ^ 31)
если numA> = 128, он станет отрицательным.
или если numD + (256 * numC) + (256 * 256 * numB) + (256 * 256 * 256 * numA)> 2 ^ 31 = 2147483648
вы увидите отрицательное число.
Все целочисленные типы подписаны
Наибольшее число, которое может храниться в неподписанном, было в два раза больше, чем в подписанном.
Пример:
long val = 2147483647; // Signed max value
unsigned long val = 4294967294; // 2x bigger number can be stored
Что делать, если вы пытаетесь хранить 4294967294 в подписи?
signed long val = 4294967294; // result will be -2
Как я говорю, значение в присвоенном может выдержать в 2 раза большее число. Эти ошибки возникают в случае превышения