2017-03-13 8 views
0

unsigned 유형의 객체에 범위를 벗어난 값을 할당하면 결과는 대상 유형이 보유 할 수있는 값의 수를 모듈로 한 값의 나머지가됩니다. 이것은 자연 스럽다. 그러나 signed 유형의 객체에 범위를 벗어난 값을 할당하면 은 정의되지 않은입니다. C++ 표준이 unsigned 대소 문자와 같이이 동작의 결과를 정확히 정의하지 않는 이유는 무엇입니까 ???C++에서 범위를 벗어난 값을 서명 된 형식의 개체에 할당 한 결과가 정의되지 않은 이유는 무엇입니까?

+0

어떻게'signed' 정수 오버플로를 정의 하시겠습니까? 'INT_MAX + 1'의 결과는 무엇입니까? – mch

답변

1

일부 프로세서는 산술 해 집을 위해 하드웨어 예외를 생성하기 때문에. 동작을 정의하기 위해 C++ 코드는 거의 모든 alu 명령 사이에 트랩을 삽입하여 프로그램을 크롤링 속도를 늦춰야했습니다.

+0

C에서 * 기존 * 정수 값을 서명 된 유형에 할당하는 동작은 너무 작아서 구현 정의 값을 저장하거나 구현 정의 신호를 발생시키는 것으로 정의됩니다. 필자는 64 비트 부호없는 정수형 (C 및 C++의 현재 표준에서 요구되는)을 지원하는 비 2의 보수 시스템을 모르기 때문에 트랩을 피하는 것이 문제가 될 것이라고 생각하지 않습니다. 반면에 오버플로에 갇히는 일부 응용 프로그램의 경우 유용 할 수 있지만 컴파일러 작성자가 트랩의 형식을 결정할 때 자신의 판단을 사용하여 유용하게 사용할 수 있습니다. – supercat

+0

... 표준위원회에서 그러한 추측을하는 것보다 의미가 있습니다. 소지품. 불행하게도, Undefined Behavior는 "어떤 방식 으로든 의도 된 목적에 가장 적합한 구현을 할 것"으로 해석되었지만 [표준의 저자는 * 그래서 컴파일러 작성자가 다음과 같은 것을 기대한다고 암시했다. 그렇지 않으면 의도 된 목적에 부적합한 행동을 구현] 컴파일러 작성자는 특정 목적에 대한 컴파일러의 적합성이 표준에 대한 적합성 이상에 달려 있다고 가정하는 것처럼 보입니다. – supercat