2013-10-15 6 views
0
for (i = 0; i <= N; ++i) { ... } 

N이 INT_MAX 인 경우이 특정 명령문은 무한 반복을 유발합니다. 및 N을 부호없는 것으로 가정하면 부호없는 오버플로가 오버 플로우를 감싸는 것으로 알려져 있으므로 컴파일러는 오버플로에서 i이 정의되지 않은 경우 루프가 정확하게 N+1 번 반복 할 것으로 추정 할 수 있습니다. 여기서주의 할 점은 다음과 내가 같은 루프를 만들 경우,INT_MAX + 1 = INT_MIN은 부호있는 정수입니까?

for (i = 0; i < N; ++i) { ... } 

이 여전히 behav을 정의되지 않습니다?

INT_MAX + 1이 부호가있는 정수의 경우 반드시 INT_MIN과 같지 않은 이유는 무엇입니까?

+0

C에서 비트 오버플로가 정의되지 않은 동작이기 때문에 –

답변

5

INT_MAX + 1

이 작업은 정의되지 않은 동작을 호출합니다. 부호있는 정수 오버플로는 C에서 정의되지 않은 동작입니다.

INT_MIN이 될 수 있으며 구현시이 표현식이 양수로 간주되거나 프로그램이 중단 될 수 있습니다. 휴대용 프로그램이이 표현식을 계산하도록하지 마십시오.

2
Why INT_MAX + 1 is not surely equal to INT_MIN in case of signed integers? 

먼저 정수 오버플로에 대한 동작은 C 표준에 의해 정의되지 않습니다. 대부분의 구현은 그 숫자가 자동으로 오버 플로우되도록하는 것처럼 보입니다.

둘째로, C 표준은 twos's complement의 정수를 가정하지 않습니다. 대부분의 플랫폼은 그것을 사용합니다. 특히 새로운 것들입니다. 예를 들어 one's complement과 같이 다른 정수 표현을 사용하는 구형 플랫폼이 있습니다. 1의 보수에서 오버플로가 발생하면 음수가 0이됩니다.

특정 방식으로 작동하는 정의되지 않은 동작에 의존하는 것은 프로그램을 훨씬 쉽게 이식 할 수 없으므로 실제로 프로그래밍을 잘못하는 것입니다. OS 또는 컴파일러를 업그레이드하더라도 정의되지 않은 동작이 변경 될 수 있으므로 동일한 OS의 서로 다른 버전간에 이식 할 수 없을 수도 있습니다.