0

以下では、numA-D のいずれかを何度も掛けると、数値が突然マイナスになります。たとえば、numA に 256 を 3 倍すると、数値は負になりますが、256 を 2 倍しただけでは負になりません。このプロジェクトの目的は、IP アドレスを unsigned long に変更してから、unsigned long を 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;
}
4

3 に答える 3

4

unsigned long符号なしです -- 負になることはできません。しかし、すべての数値、およびその結果としてのすべての計算は、ints ではなく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 に自動的に昇格されません。

于 2013-03-11T21:35:38.263 に答える
0

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
の場合、負の数が表示されます。

于 2013-03-11T21:39:06.320 に答える