C#_연산자_1
■형 변환
계산 중에 발생하는 형 변환
정수끼리 계산하면 그 결과는 정수가 된다고 결정되어 있다.
이 때문에 사람이 보기에 이상하게 계산되는 일들이 발생한다.
ex)
3➗2의 결과를 구한다(틀림) >>>>>> 3(정수) / 2(정수) = 1(정수)
→ 소수점을 제외하고 정수값만이 몫으로 나와있음. (정수가 되도록 자동으로 소수점 이하가 잘림)
정확한 답을 구하기 위해서는 실수로 표기하며 계산해야 한다.
3➗2=의 결과를 구한다(맞음) >>>>> 3.0(실수) / 2.0(실수) = 1.5(실수)
→정확한 답 1.5를 구하기 위해서는 실수로 표기하며 계산해야 한다.
코딩 ex)
using System;
class Type
{
static void main()
{
Console.WriteLine("3÷2=" + 3 / 2);
Console.WriteLine("3.0÷2.0=" + 3.0 / 2.0);
Console.WriteLine("3.0÷2=" + 3.0 / 2);
Console.WriteLine("3÷2.0=" + 3 / 2.0);
}
}
정수끼리의 계산에서 범위가 가장 큰 범위의 형으로 변환된다.
short s = 536;
byte b = 12; <-- byte의 범위는 -128~127
int a = s + b; <-- short 형으로 변환된 548이 int형 인수 a에 대입됩니다.
정밀도나 범위가 서로 다른 형끼리의 대입
정수형을 실수형에 대입(ture)
int i = 9;
float f= i;
실수형을 정수형, decimal형에 대입(false)
double d = 2.8;
long 1 = d;
decimal형을 실수에 대입(false)
decimal d = 29;
float 1 = i;
범위가 더 큰 형에 대입(true)
byte i = 10;
int f = i;
범위가 더 작은 형에 대입(false)
long d = 35;
short 1 = d;
수치형을 문자형에 대입(false)
int d = 41;
char 1 = d;
범위가 감당할 수 없는 형에 대입(false)
byte d = 74;
sbyte 1 = d;
**false 일 때는 컴파일 오류가 됩니다.
캐스트연산자
'(int)'와 같이 형명을 () 괄호로 묶은 것을 캐스트연산자(형 변환 연산자)라고 한다.
수치 등 호환성이 있는 형인 경우 이것을 값이나 변수의 앞에 쓰면 지정한 형으로 변환할 수 있다.
이 조작을형환이라고 한다.
코딩 ex)
using
class Cast
{
static void Main()
{
Console.WriteLine("3÷2=" + (float) 3/2); //float형으로 변환
Console.WirteLine("3÷2=" + 3 /(float)2); //float형으로 변환
}
}
//출력
3÷2 = 1.5
3÷2 = 1.5
checked, unchecked 문
변수에 선언된 데이터형의 범위보다 큰 값이 대입되어 자리가 넘치는 것을 오버플로 라고한다.
오버플로를 일으키면 이상한 값이 결과로 반환된다. 다양한 처리 과정에서 반환된 값이 이상해도 알아차리기 힘들다.
그래서 오버플로 했을 때 예외를 발생시키는 checked문이라는 것이 있다. 반대로 오버플로해도 무시하고,
아무것도 알리지 않은 채 결과를 반환하는 unchecked문도 있다.
기본 값에는 unchecked 상태로 설정되어 있다.
코딩 ex)
using System;
class CheckedSample
{
static void Main()
{
int a, b;
try
{
checked
{
a = int.MaxValue; //int.MaxValue는 int의 최댓값이다. 1을 더함으로써 오버플로를발생시킨다
b = a + 1; //int.MaxValue는 int의 최댓값이다. 1을 더함으로써 오버플로를발생시킨다
Console.WriteLine(b);
}
}
catch(OverflowException oe) // 오버플로우시 예외처리
{
Console.WriteLine(oe.Message);
}
}
}
}
//출력
산술 계산 결과, 오버플로우가 발생 했습니다.
checked를 지정 한 경우 오버플로 한 경우에 수행하는 예외 처리도 작성해 둬야 한다.
unchecked문은 오버플로 해도 예외가 발생하지 않으므로 예외처리가 필요하지 않다.