가능한 중복 :
Best way to detect integer overflow in C/C++C에서 long int를 위해 오버플로를 잡는 방법?
나는 C 프로그래밍 초보자 그리고 난 한 번에 long int
바이트를 읽고 공백의 끝에서 출력하는 프로그램을 작성. LONG_MAX
및 LONG_MIN
을 사용하여 오버플로/언더 플로를 catch하도록 limits.h
라이브러리에 구성해야합니다. 나는 long int
이상으로 캐스팅 할 수 없으며 음수에 대해서도 오버플로를 감지해야합니다. 여기에 내 코드입니다 :
int main(void)
{
int c;
int state;
long int num = 0;
while((c = getchar()) != EOF)
{
switch(state)
{
case 0:
{
if (isspace(c))
{
//do nothing;
}
else
{
state = 1;
num = 10 * num + (c - '0');
}
break;
}
case 1:
{
if (isspace(c))
{
printf("%ld\n", num);
num = 0;
state = 0;
break;
}
num = 10 * num + (c - '0');
if (num < LONG_MIN || num > LONG_MAX)
{
printf("overflow\n");
break;
}
break;
}
}
}
return 0;
}
if (num < LONG_MIN || num > LONG_MAX)
때 그 반대의 경우도 마찬가지 언더 플로우를 입력 LONG_MAX
+1 인 경우, 예를 들어,이 오버 플로우 때문에 일을하고 LONG_MIN
가되어 보이지 않는 부분입니다.
이 아이디어는 위험합니다. 첫째, 오버플로가 신호를 발생시킬 수 있으므로 확인하지 못할 수도 있습니다. 그렇다면 가정은 곱셈이 아니라 덧셈 또는 뺄셈의 오버 플로우에만 작용합니다. –
@JensGustedt - 정수 연산을 수행 한 결과로 신호를 올리는 오버플로를 나타내는 코드를 제공 할 수 있습니까? – selbie
'-ftrapv' 옵션을 사용하여 컴파일러로 gcc를 사용한다면 코드를 추가 할 것입니다. gcc는 또한 inverse를 허용합니다. -fstrict-overflow'는 산술 연산이 오버 플로우하지 않는다고 가정합니다. 컴파일러가 죽은 지점이라고 가정하기 때문에 검사가 최적화 될 수 있습니다. –