Длинный беззнаковый возвратный минус в переполнении стека

ниже, когда любое из 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;
}

0

Решение

unsigned long без знака — не может быть отрицательным Но все ваши числа, и в результате все ваши расчеты, являются intс не unsigned longs. intS могут быть отрицательными.

Другими словами, эта строка

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.

4

Другие решения

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
вы увидите отрицательное число.

0

Все целочисленные типы подписаны

  • ДОЛГО — Без подписи всегда подписывается от 2 147 483 648 до 2 147 483 647
  • INT — Без подписи всегда подписывается от 2 147 483 648 до 2 147 483 647
  • КОРОТКАЯ — Без подписи всегда подписывается от -32 768 до 32 767
  • FLOAT — Без подписи всегда подписывается 3.4E +/- 38 (7 цифр)
  • DOUBLE — Без подписи всегда подписывается 1.7E +/- 308 (15 цифр)

Наибольшее число, которое может храниться в неподписанном, было в два раза больше, чем в подписанном.

Пример:

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 раза большее число. Эти ошибки возникают в случае превышения

0
По вопросам рекламы [email protected]