참고 서적 : 이것이 C# 이다(저자: 박상현)
큰 정수 형식 변수에서 작은 정수 형식 변수로 옮길 때 오버플로가 발생한다.
[큰 정수 -> 작은 정수] 예시
long big = 5000000000; // 50억
int small = (int)big;
Console.WriteLine(small); // 705032704 - 약 43억 손실
부동 소수점 형식 특성상 오버플로가 존재하지 않지만 정밀성이 손상된다.
왜냐하면, float이나 double은 소수를 2진수 메모리에 보관하고 이것을 다른 형식으로 변환하려면 10진수로 복원한 후 다시 2진수로 변환 후 기록한다.
문제는 2진수로 표현하는 소수가 완전하지 않다.
예를들어 같은 수는 무한소수다.
일반적으로 부동 소수점 숫자에는 정확히 일치하는 이진 표현이 없기 때문에 컴퓨터는 해당 숫자의 근사값을 저장하므로 float을 10진수로 변환 후 double로 변환하면 정확한 값이 아닌 다른 근사값을 저장한다.
[float -> double] 예시
float f = 0.3f;
double d = f;
Console.WriteLine(d); // 0.30000001192092896
언더 플로가 발생한다.
[부호 있는 정수 -> 부호 없는 정수] 예시
int x = -30;
uint y = (uint)x; // y = 4294967266
[실수 -> 정수] 예시
float a = 0.9f;
int b = (int) a; // 소수점 아래 버림 -> b=0
float c = 1.1f;
int d = (int) c; // 소수점 아래 버림 -> d=1
[문자열 -> 숫자 / 숫자 -> 문자열] 예시
int a = int.parse("12345");
float b = float.Parse("123.45"); // 문자열 -> 숫자
// C#에서 숫자 데이터 형식은 문자열로 변환할 수 있게
// object에서 물려받은 ToString() 메서드를 재정의 했다.
int c = 12345;
string d = c.ToString(); // 숫자 -> 문자열
float e = 123.45;
string f = e.ToString();