2017-12-29 66 views
-3

정수가 한계를 초과하면 어떻게 될까요? 출력은 3595이며 어떻게 올까요? 그리고 그것은 2 바이트 타입입니까?정수가 더해 지거나 곱 해져서 한계를 초과하면 어떻게됩니까?

#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
    int n=12,res=1; 
    clrscr(); 
    while(n>3) 
    { 
    n+=3; 
    res*=3; 
    } 
    printf("%d",n*res); 
    getch(); 
} 
+0

관련 : https://stackoverflow.com/questions/3948479/integer-overflow-and-undefined-behavior – Barmar

+1

당신 때문에 정의되지 않은 행동,해야 할 것이 질문에 자신을 (대답하기 위해, 일반적인 응답을 막는다), 당신은 관대하게 printf()에 호출을 추가해야한다. 또한 환경에서 두 번째 질문에 대한 답을 찾으려면'sizeof (int)'를 출력하십시오. – Yunnosch

답변

3

이 프로그램은 정의되지 않은 동작이있을 것이다.

당신이 준 조건은 종결되지 않았습니다. 조건이 잘 정의 된 방식으로 절대로 종료되지 않는 루프입니다.

당신은 곱셈을하고 나서 오버플로를합니다. 그런 다음 n 또는 <=3에서 부정적인 결과가 발생하면 중지됩니다. 그리고 뜻하지 않게 res도 오버 플로우되었습니다. 결과적으로이 프로그램의 작동 방식을 알 수 없습니다. 우리는 결과가 무엇인지 확신 할 수 없습니다.

+0

그래, 이해하지만 컴파일러에서이 프로그램을 실행하면 확실하게 답변을 얻을 수있다. 실행될 때 어떻게 될까? – Mathan

+0

@Mathan : 네 .. 그게 설명되고 있습니다. 당신은 결코 확신 할 수 없습니다. 대부분 특정 지점 다음에 오버플로가 발생하고 그 결과는 확실한 것이지만 다시 아키텍처에 따라 달라집니다. 당신은 결코 확신 할 수 없습니다. 어쩌면 당신의 교수 기계는 당신이 대답을 확인할 때 당신과 다른 행동을 할 것입니다. :) – coderredoc

1

동작이 정의되지 않았습니다. 특정 것에 의존해서는 안됩니다. int 오버 플로우에 대한 일반적인 증상은 다음과 같습니다

  1. 둘러싼1 + INT_MAXINT_MIN를이되도록. 이것이 내가 만난 모든 Windows PC가하는 것입니다. 연산에 의해 생성 된 비트 패턴은 정확히 unsigned 사촌과 일치합니다.

  2. 1 + INT_MAXINT_MAX을가되도록 클램핑. 나는 이것을 1990 년에 UNIX의 변형을 실행하는 기계 (부호가있는int)와 함께 관찰했다.

+0

최신 컴파일러는 조건이 항상 참이기 때문에'n' 변수를 최적화 할 수 있습니다. – willys

+0

@willys : 아직이 일을하지 못한 사람이 있습니까? – Bathsheba