본문 바로가기

프로그래밍/C 기초

[C언어 강좌] #32 자료형의 변환 (형변환)

자료형의 변환은 char형을 int로 바꾸거나 int를 double로 바꾸는식으로 표현방식을 바꾸는것을 말합니다.


형변환에는 두가지 종류가 있는데

자동 형 변환과 강제 형 변환이 있습니다.

자동 형 변환은 자동으로 발생하는것이고 강제 형 변환은 프로그래머가 직접 형 변환을 해줘서 강제로 변환이 일어나는겁니다.



 

위 예제는 자동 형변환이 일어나는 상황입니다.

실수형인 double형에 int형 정수인 100이 대입되려할때 자동으로 상수 100은 형 변환이 일어납니다.

상수가 자동으로 double형으로 변환되어서 100.0으로 변환되서 대입됩니다.


이런식으로 정수형을 실수형으로 바꿀때는 단순히 뒤에 소수점이 붙는것으로 실수형으로 바뀔수 있습니다.

하지만 실수형을 정수형에 넣으려할때는 어떻게 변환될까요?




정수형 변수에 실수형 데이터를 넣어버리면 소수점부분이 버려집니다.



그럼 이번에는 char형변수에 int형변수를 담아봅시다.



이경우에는 상위 바이트의 손실이 일어나서 10000001만 남게됩니다.

맨 앞자리는 부호를 결정하는곳이기 때문에 -127로 바뀌었습니다.


자동형변환은 이런식으로 자료형의 불일치로 일어납니다. 하지만 이것은 대입에서만 일어나지 않습니다.

연산을 할때 두개의 피연산자가 필요한 경우가 있습니다. 근데 그 둘의 자료형이 일치하지 않는다면 그떄도 형변환이 일어납니다.




이런경우에는 정수형과 실수형이 있어서 한쪽을 형 변환 해줘야한다.

하지만 어느쪽으로 형변환해줄까? 만약 10.5를 정수로 바꾸려하면 데이터의 손실이 일어나서 정확한 계산이 되지 않을것이다.

그래서 이럴때는 형 변환이 데이터의 손실이 적은 방향으로 진행됩니다.


그 우선순위는 아래와 같습니다.


long double - double - float - long long - long - int


근데 여기서 이상한점이 있네요.

float보다 long long이 바이트 크기가 더 큽니다. 하지만 어째서인지 float의 우선순위가 더 높은걸 볼수있습니다.

long long은 정수형이기때문에 단순히 바이트 크기가 크다고 이쪽으로 변환하려하면 소수점이 버려지게됩니다.

그렇게 되면 손실이 더 크게 일어날수 있기때문에 바이트 크기에 상관없이 실수형이 무조건 우선순위가 더 높습니다.


그럼 이제 자동형변환은 알아봤으니 강제형변환에 대해서 알아봅시다.


위 예제의 경우 10에서 4를 나눴는데 2가 나오는 이상한 현상이 발생해버렸습니다.

이것은 두 피연산자가 모두 int형으로 일치해서 형변환이 일어나지 않고 나눗샘했을때 소수점자리가 버려져서 생긴 일입니다.

10과 4를 나눠서 2.5가 됐지만 두 피연산자는 정수형이였기때문에 연산 결과도 정수형으로 바뀌어서 2로 변환되고  그게 실수형변수에 대입되면서 다시 실수로 바뀌어서 2.0이 출력됐습니다.


이런 상황을 해결하려면 강제로 형변환을 해주면 됩니다.


이런식으로 앞에 (자료형의 이름)을 넣어주면 그 자료형으로 강제로 형 변환이 진행됩니다.

num1이 실수형으로 바뀌어서 연산할때 피연산자의 자료형 불일치로 인해서 위에서 설명했던 자동 형변환이 일어납니다.

그래서 num1과 num2는 둘다 실수형으로 바뀌어서 계산되고 2.5가 정상적으로 출력될수 있습니다.