2013-03-11 6 views
0

아래 표시합니다. 예를 들어 numA에 256을 3 배 곱한 경우 숫자는 음수가되지만 256을 두 번 곱한 경우에는 음수가됩니다. 이 프로젝트의 목적은 IP 주소를 부호없는 long으로 변경 한 다음 부호없는 long을 IP 주소로 변경하는 것입니다.numA-D를 여러 번 곱하면 숫자가 갑자기 음수가 될 때 C++에서 음수를 반환하는 부호없는 long을

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

따라서 numA, numB, numC 및 numD 변수를 *** signed *** int로 선언하지 마십시오. *** 부호없는 *** 키워드를 명시 적으로 사용하지 않으면 변수에 서명됩니다. – enhzflep

+0

[부호가있는 정수 오버플로] (http : //en.wikipedia.org/wiki/Integer_overflow)는 정의되지 않은 동작입니다. –

답변

4

unsigned long은 음수 일 수 없습니다. 그러나 귀하의 모든 숫자와 계산 결과는 모두 int입니다. unsigned long이 아닙니다. int은 음수가 허용됩니다. 또 다른 방법을 넣어

,이 라인

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 있습니다와 동일하고 자동 부호 없음 long으로 승격되지 않습니다.

+0

이것이 내가 찾던 바로 그 것이었다. –

0

int는 32 비트입니다. numA> = 128 일 경우 최대 값은 2^31 = 256 * 256 * 256 * 128 - 1입니다 (그 하위 값은 -2^31)
음수가됩니다.
또는 numD + (256 * num *) + (256 * 256 * 256 * numA)> 2^31 = 2147483648
이면 음수가 표시됩니다.

+0

아니요, 'int'는 항상 32 비트가 아닙니다. 모든 기계 2의 보완 기계도 아닙니다. –

0

모든 정수 타입은

  • LONG을 서명 - 항상 서명 Whitout 부호 -2,147,483,648 2,147,483,647
  • INT에 - Whitout 부호 항상 서명 -2,147,483,648 2,147,483,647
  • 에 단축 - 서명이없는 Whitout은 항상 -32,768에서 32,767 사이에 있습니다.
  • ,
  • FLOAT - 항상 3.4E + 38 (7 자리) 서명 Whitout 부호
  • DOUBLE - 항상 1.7E +/- 308 (15 진수)를 체결 Whitout 부호

서명되지 않은 상태로 저장할 수있는 최대 숫자는 서명 한 것보다 2 배 더 큽니다.

예 :

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 배 큰 숫자로 나타납니다. 이 오류는 초과시 발생합니다