2016-08-21 1 views
0

내가 작업 중이던 프로그램 중 하나에서 버그를 발견하고 코드를 추출했으며 기본적으로이 문제가 있습니다.
그것은 무한 루프에 서명 INT 결과에 부호 비교 않습니다 나는C++ 부호없는 무한 루프 비교 버그

#include <iostream> 

int main() 
{ 
    unsigned int i = 0; 
    while (i < 1000000) 
    { 
     printf("%o\n", i); 
     ++i; 
    } 
    return 0; 
} 

대신 사용하여 시도 : 내가 생각

#include <iostream> 

int main() 
{ 
    unsigned int i = 0; 
    while (i < 1000000u) 
    { 
     printf("%o\n", i); 
     ++i; 
    } 
    return 0; 
} 

이 서명/서명 비교를 해결하는 것, 그리고 그것은, 그것은 여전히 ​​무한 루프를 치고 있어요. 그래서 저는 unsigned int로 주사위를 던지려고 시도했지만, 주사위는 없었습니다. 여전히 무한 루프였습니다.

Visual Studio 2015를 사용하여 전체 최적화, 릴리스 컴파일러.

+6

무한 루프가 확실합니까? 이것은 특히 인쇄에 상당한 시간이 걸리기 때문에 나에게는 매우 긴 루프처럼 보입니다. 종료 조건이 작동하는지 보려면'i + = 1000'으로 변경하십시오. – dasblinkenlight

+0

이것은 서명 된/서명되지 않은 비교의 문제가 아닙니다. 값 '1000000'은 두 범위에 있으며, 이것이 그 이유라고 가정하고 문제를 해결하려고했지만 작동하지 않았습니다. – AhmadWabbi

+1

왜 #include '하지만'printf'를 사용합니까? – dxiv

답변

3

를 사용해야하는 무한 루프에 빠지게된다고 생각하게 만듭니다. %o 매개 변수를 %u으로 변경하면 문제가 명확해질 수 있습니다.

+0

허, 분명히 사실입니다. std :: cout << std : : oct << n << '\ n'은 기본 정수를 8 진수로 수정합니다. 원래는 원래 사용했던 정수입니다. –

1

int 유형 오버플로 때문입니다. 유형 limits을 참조하십시오. 내가 문제가 부호없는 8 진수 표현와의 printf() 함수를 믿고 Win7에도 우분투 (64 비트 모두)에 무한 루프를 재현 할 수는 없지만 그런 엄청난 수의 비교를 위해 당신은 long 대신 int

+0

보다 훨씬 클 수도 있지만 요즘 대부분의 플랫폼에서'int'는 적어도 32 비트입니다. – Blorgbeard

+1

이럴 가능성은 희박합니다. OP는 기본 int 타입이 32 비트이고, '1000000'보다 훨씬 넓은 VS 2015를 언급했습니다. – dxiv

+0

과 VC++에서 컴파일 된 64 비트는 숫자를 인쇄합니다. 한계에 도달 할 때까지 멈추지 않습니다. 서명되지 않은 규칙으로 인해 여전히 멈추지 않습니다. 그냥 시작합니다. –