https://gpgstudy.com/forum/viewtopic.php?t=5049
[C++] 4-7. [데이터 타입/ 자료형] 형변환(Casting , 캐스팅)
[뇌를 자극하는 C++ , 저.이현창]책을 기준으로 작성하였습니다
형변환(Casting , 캐스팅) |
형변환(Casting)이라는 주제는 C++ 프로그래밍에 있어서 아주 중요한 부분을 차지하고 있습니다.
형변환은 여러 가지 경우에 발생할 수 있습니다. 그 중에서 대표적인 경우가 한 변수에 보관되어 있던 값을 다른 타입의 변수에 대입하는 경우입니다.
형변환은 아주 흔하게 발생합니다.
저희가 의식하지 못하는 사이에도 컴퓨터에 의해 형변환이 발생합니다.
또한 저희가 직접 형변환을 시켜주어야 하는 경우도 생깁니다.
그만큼 형변환은 C++개발자의 일상 생활에서 빼놓을 수 없는 주제입니다.
1. 다른 타입으로 형변환이 발생하는 경우 (묵시적 형변환) |
-> 값이 어느 정도 잘리는 경우도 발생
-> 정밀도가 떨어지는 경우도 발생
-> 전혀 엉뚱한 값으로 바뀌는 경우 발생
[ 실수형 -> 정수형 ]
|
-> 실수형을 정수형으로 캐스팅하면 소숫점 이하 값은 손실 되는걸 볼 수 있다.(반올림이 아니다)
언제 어떤 타입이 형변환 되는가?? 규칙이 존재합니다.
[중요]
long double > double > float > unsigned long > long > unsigned int > int
-> 왼쪽이 큰쪽이고 우측으로 갈수록 작은쪽이다.
-> a와 b가 존재할때 a는 int형 b는 float형 일때, b = a 라는 식이 존재하면????
-> 더 큰 자료형이 float임으로... a가 float로 형변환 되어 b에 대입된다.
[예외]
한 가지 예외는 피연산자의 한 쪽이 long 타입이고 다른 한 쪽이 unsigned int 타입인 경우에는 두 가지 가능성이 있습니다.
기본 규칙에 의한다면 long 타입으로 나머지 한 쪽이 형변환해야 하지만, 만약에 long 타입이 unsigned int 타입의 값을 보관할 수 없는 경우라면 두 피연산자 모두 unsigned long 타입으로 형변환 합니다.
-> 예로 unsigned int 타입의 변수가 25억의 값을 가지면 long 타입은 값을 보관할 수 없는 경우입니다. 그래서 두 변수 모두 unsigned long 으로 형변환 후 연산이 됩니다.
2. 사용자가 직접 형변환을 시키는 경우 (명시적 형변환) |
개발자가 직접 형 변환을 시키는 것을 명시적 형변환이라 합니다.
명시적으로 형변환을 시키게 되면 굳이 다른 타입의 변수에 대입하지 않더라도 형변환이 일어남.
|
[tip] 명시적인 형변환에는 임시 변수가 수반된다.
이 변수는 우리에게 보이지는 않지만 컴퓨터가 내부적으로 사용하려는 목적으로 만드는 변수이다.
예를 들어, (char)i 라고 적어주면 , 내부적으로 char타입의 변수가 하나 만들어진다.
그리고는 i의 값이 이 임시 변수에 대입되면서 형변환을 발생하는 것.
-> 문제점으로 성능 저하가 생길 수 있다.
3. 형변환시에 값이 변경되는 경우 |
[1]실수 타입에서 정수 타입으로 형변환이 발생하는 경우 실수의 소주점 이하 부분이 잘리게 된다.
[2]모든 타입에서 bool 타입으로 형변환할 때, 모든 0이 아닌 수는 true 즉, 1로 바뀐다.
0은 그대로 0으로 남아 flase의 의미를 갖는다.
4. 문제가 발생하는 형변환 |
문제가 발생하는 형변환의 공통적인 조건은 큰 타입에서 작은 타입으로 형변환이 일어난다는 것!!!!
(위의 예제들이 전부 해당됨)
큰 타입의 변수에 담겨있던 값이 작은 타입의 변수에 담길 수 없을 만큼 크다면 물리적 한계로 인해 올바른 값을 담을 수 없게 된다.
이런 경우에는 값의 일부가 잘려나가거나 예상할 수 없는 이상한 값으로 변질되어 버린다.