안녕하세요. BlockDMask 입니다.
C언어, C++과는달리 C#에는 정말 신기한것들이 많네요.
오늘은 overflow, underflow를 체크해주는 checked, unchecked 키워드에 대해서 살펴보겠습니다.
1. C# checked, unchecked 란?
▼ checked?
chekced 키워드는 상수값 들의 연산이나 변환에 의한 오버플로, 언더플로 검사를 컴파일러 단에서 걸러주도록 하는 키워드 입니다.
▼ unchecked?
unchecked 키워드는 상수값 들의 연산이나 변환에 의해 오버플로, 언더플로가 생긴다 하더라도 컴파일러에게 "내가 의도한거니까 무시해라" 하는 키워드 입니다.
▼ 여기서 오버플로 언더플로에 대해서 알아보고 넘어가겠습니다.
*overflow(오버플로)?
데이터 타입이 표현할수 있는 최대값을 넘어버려서 최소값이 되는 경우를 말합니다.
*underflow(언더플로)?
데이터 타입이 표현할 수 있는 최소값을 넘어버려서 최대값이 되는 경우를 말합니다.
ex) C#에서는 byte 타입이 있습니다. 이 byte는 부호없는 8비트 정수를 표현하는 자료형입니다.
2에 8제곱이기 때문에 0~255범위의 총 256개의 수를 표현할 수 있는 데이터 타입입니다.
값이 255의 byte 타입 변수에서 +1을 하면 256이 되어야하는데 byte 타입의 표현할 수 있는 수는 255가 한계지요. 그래서 결과값이 우리의 의도와는 다르게 0이 되어버립니다. 이런경우를 데이터 타입의 최대 표현범위를 넘었다. 오버(over)했다 해서, 오버플로우(오버플로, overflow)라고 합니다.
반대로, 값이 0 인 byte 타입 변수에서 -1을 하게 되면 0을 넘어서 -1을 의도했겠지만, byte타입이 표현할 수 있는 최소값은 0이기 때문에 -1을 하게 되면 255가 나오게 됩니다. 이런 경우를 데이터 타입의 최소 표현범위를 넘었다. 언더(under)했다 하여서, 언더플로우(언더플로, underflow)라고 합니다.
2. C# checked 예제1 (overflow)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace exCSharp { class _20190320_checked_unchecked { static void Main(string[] args) { byte a = 255; checked { a++; //over flow } Console.WriteLine("overflow : " + a.ToString()); } } } | cs |
▲ checked 예제1 결과.
위에 나오는 것 처럼 컴파일단에서 overflow를 감지하는걸 볼 수 있습니다.
3. C# checked 예제2 (underflow)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace exCSharp { class _20190320_checked_unchecked2 { static void Main(string[] args) { byte b = 0; checked { b--; //under flow } Console.WriteLine("underflow : " + b.ToString()); } } } | cs |
▲ checked 예제2 결과.
위에 나오는 것 처럼 컴파일단에서 underflow를 감지하는걸 볼 수 있습니다.
(vs에서는 underflow, overflow 둘다 overflow라고 표현을 합니다.)
4. C# unchecked 예제(overflow, underflow)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace exCSharp { class _20190320_checked_unchecked3 { static void Main(string[] args) { byte a = 255; byte b = 0; unchecked { a++; //overflow b--; //underflow } Console.WriteLine("unchecked example. BlockDMask."); Console.WriteLine("overflow [255++] : " + a.ToString()); Console.WriteLine("underflow [0-- ] : " + b.ToString()); } } } | cs |
▲ unchecked 예제 결과.
위에 나오는 것 처럼 명확하게 overflow, underflow가 일어난다 해도, 컴파일단에서는 무시하고 무사히 프로그램이 실행 되는걸 볼 수 있습니다.
'<개인공부> > [C#]' 카테고리의 다른 글
[C#] Abs 절대값 함수에 대하여. (0) | 2019.07.10 |
---|---|
[C#] 리터럴(Literal)이란? (7) | 2019.07.05 |
[C#] random, 랜덤 클래스에 대해서 (랜덤함수, 난수생성) (0) | 2019.05.08 |
[C#] params 가변인자 매개변수에 대해서. (4) | 2019.03.21 |
[C#] 계산기 윈도우폼 (0) | 2019.02.22 |
[C#] foreach 사용법과 다양한 예제 (1) | 2019.01.11 |
[C#] 리터럴, 예약어, 식별자에 대해서 (literal, reserved word, identifier) (3) | 2019.01.11 |
[C#] 배열 초기화, 다차원배열, 가변배열에 대해서 (array, jagged array) (4) | 2019.01.10 |