다음과 같은 코드로 인해 산술 오버 플로우의 정의되지 않은 동작을 호출하는 것이 분명 보인다i ++는 오버플로의 경우 int보다 작은 서명 된 유형에 대해 정의되지 않은 동작을 호출합니까?
#include <limits.h>
int test(void) {
int i = INT_MAX;
i++; /* undefined behavior */
return i;
}
그러나보다 작은 서명 유형에 대한 int
같은 short
또는 signed char
로? (더 작게, 각각 SCHAR_MAX < INT_MAX
과 SHRT_MAX < INT_MAX
이라고 가정).
다음 중 정의되지 않은 동작을 호출하는 함수는 무엇입니까? 그 이유는 무엇입니까?
signed char test2(void) {
signed char i = SCHAR_MAX;
i = i + 1; /* implementation defined */
return i;
}
signed char test3(void) {
signed char i = SCHAR_MAX;
i += 1; /* undefined behavior or implementation defined? */
return i;
}
signed char test4(void) {
signed char i = SCHAR_MAX;
i++; /* undefined behavior or implementation defined? */
return i;
}
signed char test5(void) {
signed char i = SCHAR_MAX;
++i; /* undefined behavior or implementation defined? */
return i;
}
추론을 뒷받침하는 참조 자료를 제공하거나 인용하십시오.
signed char i = SCHAR_MAX;
i++;
운영자 접미사가 ++ 정수 프로모션 또는 일반적인 산술 변환 1을 수행하지 않습니다
부호있는 정수는 내부 형식과 크기에 관계없이 부호있는 정수입니다. 그러나 'test2'에있는 경우 예를 들어 'int j = i + 1;'그렇다면'i'는 [* promoted *] (http://en.cppreference.com/w/cpp/language/implicit_conversion#Integral_promotion)에서 'int'. –
내가 ++로 정의되지 않은 행동을하게 만든 이유는 무엇입니까? 나는 그 행동이 잘 정의되어 있다고 생각했다. –
@DonghuiZhang 부호있는 정수 오버 플로우가 "필수"가 아닙니다. –