반응형

http://soulduo.tistory.com/77


숫자 데이터 형식에 대해 상한 값과 하한 값이 고정되어 있다.

(이는 MaxValue / MinValue 로 확인 가능하다.)

프로그래머의 실수로 상한 값과 하한 값을 범위를 넘겨 값을 활당할 경우

각각 '오버플로우'와 '언더플로우' 상황이 발생한다.

CLR에서는 두 경우 모두 '오버플로우'로 통칭한다.

왜 '가 발생한다'로 표기하지 않고 '상황이 발생한다.' 라고 표현했는지는

기초를 충실히 했다면 간단한 설명으로 이해가 가능할 것이다.

이는 byte의 최대 값이 255이라는 것을 생각하고 다음의 경우를 보자.

byte b1 = 100;
byte b2 = 250;
byte b3 = (byte) b1 + b2;

이 때 b3의 값은 얼마일까?

b3에는 넘치고 남는 값만이 남게 된다. (350 - 256 = 94)

상황이 발생한다는 것은 논리 에러만이 존재하며 예외 상황이 발생하지 않기 때문에

표현한 것이다.

간단한 연산에 대해서는 프로그래머가 모두 관리 가능하겠지만

어째건 모든 프로그래머는 실수를 하기 마련이다.

(존경 받는 '찰스 페졸드' 같은 사람도 어떤 부분에서든 실수를 하고)

(이를 바로 잡을 것이다.)

아무튼 이러한 상황을 프로그래밍 차원에서 규제할 수 있다.

이 때 사용되는 코드가 checked이다.

다음과 같이 코드를 작성하게 되면 오버 플로우 상황에서

System.OverflowException 예외가 발생하게 된다.


try
{

byte b3 = checked((byte)(b1 + b2));
}
catch(OverflowException e)
{
Console.WriteLine(e.Message);
}

비쥬얼 스튜디오의 경우 프로젝트 속성 페이지의 산술 연산 오버플로/언더플로 확인

옵션을 'True'로 설정함으로 프로젝트 단위에서 예외 발생 여부를 확인할 수 있다.

하지만 모든 상황에서 예외 처리를 하고 싶지 않을 때가 있을 것이다.

이럴 때 'unchecked' 키워드를 사용하게 된다.

unchecked
{
byte b3 = (byte)(b1 + b2);
}

모든 오버플로우 체크 중에 다음의 연산에서는 예외 상황을 발생시키지 않으며

(350 - 256 = 94)의 연산을 수행하여 b3는 94의 값을 가지게 된다.


반응형

+ Recent posts