본문 바로가기
기타/보관소

C언어 :: 자료형의 변환

by rockykim 2015. 11. 23.







C언어 :: 자료형의 변환






자료형의 변환은 크게 두 종류로 나뉜다.


1. 자동 형 변환(묵시적 형 변환)


- 대입연산의 전달과정에서 발생하는 자동 형 변환

- '정수의 승격(Integral Promotion)'에 의한 자동 형 변환

- 피연산자의 자료형 불일치로 발생하는 자동 형 변환



2. 강제 형 변환(명시적 형 변환)









1. 자동 형 변환(묵시적 형 변환)

- 대입연산의 전달과정에서 발생하는 자동 형 변환

대입 연산자의 왼편과 오른편에 존재하는 두 피연산자의 자료형이 일치하지 않으면, 왼편에 있는 피연산자를 대상으로 형 변환이 자동으로 일어난다. (저장소의 자료형에 맞춰 형 변환이 일어나야 값의 저장이 가능하다).

double num1 = 245; -> double num1 = 245.0;

위와 같은 경우 대입 연산자의 왼편에 있는 num1은 double형이지만, 245는 int형이다.
따라서 int형 정수인 245가 double형 실수 245.0으로 형 변환되어서 num에 저장된다.

int num2 = 3.1415; -> int num2 = 3;

위와 같은 경우는 double형 상수 3.1415가 int형으로 변환되어 변수 num2에 저장된다.

int형은 알다시피 정수형이라 소수점 이하의 값을 표현할 수 없으므로,
형 변환의 과정에서 3.1415가 정수 3으로 변환되어서, 그 결과값이 num2에 저장된다.

위와 같이 실수형 데이터를 정수형 데이터로 변환하는 과정에서 '소수부의 손실'이 발생한다.

int num3 = 129;

char ch = num3;


129가 저장된 변수 num3의 비트 열은 다음과 같다.


00000000 00000000 00000000 10000001


이 데이터를 변수 ch에 저장하기 위해서는 1바이트 크기로 줄여야 한다.

이 경우에는 '상위 바이트의 손실'이 발생하며, 그 결과는 다음과 같다.


10000001

이는 정수로 -127이다. 상위 바이트의 손실로 부호가 바뀐 경우이다.



- '정수의 승격(Integral Promotion)'에 의한 자동 형 변환

일반적으로 CPU가 처리하기에 가장 적합한 크기의 정수 자료형을 int로 정의한다. 따라서 int형 연산의 속도가 다른 자료형의 연산속도에 비해 동일하거나 더 빠르다.

따라서 int보다 작은 크기의 정수형 데이터는 int형 데이터로 형 변환이 되어서 연산이 진행된다.
다음과 같은 경우 역시 int형으로의 자동 형 변환이 발생하는 경우다.

int main(void)
{
short num1 = 15, num2 = 25;
short num3 = num1 + num2;
}

여기서 num1과 num2가 int형으로 형 변환이 발생한다. 그런데 위의 코드에서 정수의 승격만 일어난 게 아니다.
num1 + num2의 계산결과는 4바이트 크기의 int형 정수이다. 따라서 이 값을 변수 num3에 저장하기 위해서,
대입연산 과정에서의 형 변환('상위 바이트의 손실')이 다시 일어나게 된다.



- 피연산자의 자료형 불일치로 발생하는 자동 형 변환

사칙연산과 같은 기본적인 산술연산에는 두 개의 피연산자가 필요하다. 이 둘의 자료형은 일치해야 하며, 만약 일치하지 않을 시에는 자료형의 일치를 목적으로 자동 형 변환이 일어난다.

double num1 = 5.15 + 19;

실수형 데이터 5.15와 정수형 데이터 19의 합을 요구하고 있다. 그런데 정수와 실수는 표현방식이 다르므로 사실상 덧셈이 불가능하다. CPU는 같은 자료형의 두 피연산자를 대상으로만 연산이 가능하도록 설계되어 있기 때문이다.

따라서 5.15를 정수형으로 형 변환하거나 19를 실수형으로 형 변환해야 한다. 그러나 5.15를 정수형으로 변환하면 소수부의 손실로 5가 된다. 19를 실수형으로 변환하면 19.0이 되어 데이터의 손실이 최소화된다.

즉, 피연산자의 자료형이 일치하지 않아서 발생하는 자동 형 변환은 데이터의 손실을 최소화하는 방향으로 진행된다. 다음은 산술연산에서 형 변환 규칙이다.

하위   int -> long -> long long -> float -> double -> long double   상위

(형 변환의 기준은 '데이터 손실의 최소화'이다)

두 피연산자가 다를 경우 상위 우선순위를 가진 연산자로 하위 우선순위를 가진 연산자가 형 변환이 된다.
int형과 double형을 예로 들자면, int형이 double형 실수로 형 변환되어, 연산이 진행된다.

char형 정수와 short형 정수는 '정수의 승격'에 의해 둘 다 int형 정수로 변환된다.




2. 강제 형 변환(명시적 형 변환)

명시적 형 변환이란, 형 변환 연산자를 이용해서 강제로 형 변환을 명령하는 것을 의미한다.


연산결과의 자료형은 피연산자의 자료형과 일치하기 때문에, 나눗셈의 결과는 0이 되고(정수형 나눗셈 결과의 몫), 이 값이 double형으로 자동 형 변환되어 변수 divResult에 저장된다. 


이번엔 0.75가 출력됬다.


C언어에서의 소괄호는 형 변환을 명령할 때도 사용이 된다. 즉, (double)num1은 변수 num1에 저장된 값을 double형으로 변환하라는 뜻이다. 이렇게 사용되는 소괄호를 가리켜 '형 변환 연산자(Type Casting Operator)'라 한다.


num1이 double형으로 변환 연산이 되었다. num2 역시 연산을 위해서 double형으로 변환된다.


divResult = 3.0 / 4.0;


마지막으로 나눗셈이 진행되고, 그 결과가 변수 divResult에 저장된다.








참고서적 : 윤성우 저 열혈강의 C 프로그래밍 개정판 125p ~ 130p.









댓글