2014-04-25 1 views
1

사용자 입력 번호의 역순으로 프로그램을 작성하려고합니다.최대 부호없는 정수의 역순 번호

사용자 입력 범위 여기 코드 편집 0 <에서 < 4294967295이다.

unsigned long int reverseNumber(unsigned long int num) 
{ 
    unsigned long int rev = 0; 

    while (num > 0) 
    { 
     rev = rev *10 + (num%10); 
     num = num/10; 
    } 

    return rev; 
} 

문제는 때 입력 4294967295, 출력됩니다 1632727628. 이유는 무엇입니까? 왜 그런 일이 일어 났는지 나는 모른다. 어떻게하면 4294967295를 뒤집을 수 있습니까?

% lu를 사용하여 printf를 unsigned long int로 변경했지만 여전히 1632727628을 출력합니다. 왜?

+4

정수 오버플로가 발생합니다. – thumbmunkeys

+0

int를 char 배열로 변환하고 끝에서부터 시작하여 인쇄하십시오. – someuser

+0

하지만 그것을 부호없는 long int로 변경하면 여전히 같은 대답을 출력합니다. 왜? – user2301281

답변

2

4294967295의 반대는 5927694924이며 32 비트에 저장할 수있는 가장 큰 정수인 4294967295보다 큽니다.

+0

하지만 unsigned long int로 변경하면 여전히 같은 대답을 출력합니다. 왜? – user2301281

+2

@ user2301281'unsigned long int '도 32 비트이기 때문에.'unsigned long long int'로 변경해야합니다. 64 비트입니다. – peterh

+0

아니요, unsigned long long int로 변경합니다. 547093574220을 출력합니다. – user2301281

7

4294967295의 역방향 시스템에서 unsigned int

범위보다 큰 5927694924이다 unsigned int 대표 할 수 unsigned int42949672950xFFFFFFFF 것을 32-bit 폭, 따라서 최대 값이다. 그래서 결과가 넘치고 32 비트에 남아있는 것이 출력으로 표시됩니다. 만약 헥스 5927694924을 나타내면

, 그것은 폐기 추가 33rd1 비트를 갖는다 0x16151724C하며 따라서 출력 진수 1632727628이다 0x6151724C이다.

화면에 인쇄하려면 컴파일러가 64 비트 정수에 대한 지원 어떤 (64 비트 시스템에서만) unsigned long long 또는 uint64_t 또는 unsigned long 같은 큰 데이터 형식을 필요합니다.

+0

상기시켜 줘서 고마워, 나는 그것에 대해 잊어 버려. – user2301281

+1

아니요, 단순 빼기가 아닙니다 (이 경우 결과는 동일 할 수 있음). 실제로는 '5927694924 % 4294967295'과 같은 모듈입니다. –

+0

감사합니다 모두들 !! = D – user2301281

2

문제는 4294967295를 입력하면 1632727628이 출력됩니다. 이유는 무엇입니까?

unsigned int은 최대 값 2^32-1을 저장할 수 있습니다. 4294967295의 반대는 2^32-1보다 훨씬 큰 5927694924입니다. 따라서 출력은 1632727628입니다. 1632727628 사실은 5927694924 % 4294967296

unsigned long it을 사용해야합니다. 그러나 번호가 가장 긴 것보다 크면 다시 오버 플로우됩니다.

+0

32 비트 시스템의 경우에만 적용 – thumbmunkeys

+0

그러나이 값을 부호없는 long int로 변경하면 여전히 동일한 결과가 출력됩니다. 왜? – user2301281

+0

@ user2301281'unsigned long'은 보통'unsigned int'와 같은 일이기 때문에 –

관련 문제