3장 코딩과 디버깅에 관하여 2
3.5 변수 범위의 이해
- 산술 오버플로(arithmetic overflow)
- 어떤 식의 계산 값이 반환되는 자료형의 표현 가능한 범위를 벗어나는 경우
흔히 저지르는 오버플로의 원인과 해결방법
- 결과값이 너무 크다.
- 더 큰 자료형을 사용한다.
- 연산의 중간 값이 너무 크다.
- 이항계수(binomial coefficient) 을 로 계산한다.
- 무한대 값이 너무 크다
- signed 32bit integer의 경우 무한대 값으로 987,654,321을 추천한다.
자료형의 프로모션(binary operator)
- 프로모션
- binary operatioin 중 발생하는 type conversion/casting
C++ 기준으로,
- 정수형 operator 실수형 : 정수형 -> 실수형
- 양쪽 모두 같은 type: 보다 넓은 범위를 갖는 type으로 변환
- 양쪽 모두 int형보다 작은 정수형: 양쪽 다 int로 변환
- unsigned operator signed : signed -> unsigned
특히 조심할 것은 C++의 경우, STL에 속한 모든 컨테이너의 size( )의 return type은 size_t type(unsigned integer)이라는 점이다. 그래서,
for(int i = 0; i < seq.size() - 1; i++) {
...
}
와 같은 반복문에서 seq.size( ) = 0
이라면 강제 캐스팅을 하게 되고 언더플로우가 발생하여 반복문은 size_t형의 가장 큰 수인 232-1번 반복하게 될 것이다.
또한 arr[ ]의 범위 밖의 값에 접근해서 런타임에러가 발생할 수도 있기 때문에
- 애초에 seq[ ]가 비어 있는 경우를 예외로 처리한다.
- seq.size( )를 int형으로 변환한다.
- i를 1부터 시작하고 seq[i]를 seq[i - 1]로 변경한다.
중 한 가지 방법을 사용해야한다.
Back to top ↑
Leave a comment