3장 코딩과 디버깅에 관하여 2

Updated:
1 minute read

3.5 변수 범위의 이해

산술 오버플로(arithmetic overflow)
어떤 식의 계산 값이 반환되는 자료형의 표현 가능한 범위를 벗어나는 경우

흔히 저지르는 오버플로의 원인과 해결방법

  1. 결과값이 너무 크다.
    • 더 큰 자료형을 사용한다.
  2. 연산의 중간 값이 너무 크다.
    • 이항계수(binomial coefficient) binomail coefficientpascal's rule로 계산한다.
  3. 무한대 값이 너무 크다
    • signed 32bit integer의 경우 무한대 값으로 987,654,321을 추천한다.

자료형의 프로모션(binary operator)

프로모션
binary operatioin 중 발생하는 type conversion/casting

C++ 기준으로,

  1. 정수형 operator 실수형 : 정수형 -> 실수형
  2. 양쪽 모두 같은 type: 보다 넓은 범위를 갖는 type으로 변환
  3. 양쪽 모두 int형보다 작은 정수형: 양쪽 다 int로 변환
  4. 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