강제 형 변환

2013. 10. 23. 02:36 from Language/C언어

강제 형 변환이란 자료형을 강제로 변환 시키는 것이다. 대충 이름만 봐도 감이 올 것이다.

강제 형 변환이 어떤 경우에 유용한지 살펴보자.

#include <stdio.h>

int main()
{
int a = 1;
int b = 2;

float f =  a / b;
printf("나눗셈 결과 : %f \n", f);

return 0;
}

위 결과를 예상해 보면 정수형 데이터끼리 연산했을 지라도 실수형 변수 f 로 연산 결과를 대입했으므로 0.5000 가 제대로 대입 됐을 것이라 생각할 수 있다. 하지만 실제로 연산 결과를 보면 0.0000 으로 출력 된다. 왜 이런 현상이 발생했을까?

C언어는 문법적으로 산술 연산결과의 자료형은 피 연산자의 자료형과 일치하기 때문이다. 무슨 말인고 하니 정수형 데이터끼리 연산을 하면 정수형 데이터가 생성되고, 실수형끼리 연산을 하게 되면 실수형 데이터가 생성된다는 뜻이다. 위 예제를 풀어서 보면 1/2 연산 결과는 0.5 이지만 정수형 데이터끼리 연산했으므로 결과물도 정수형이여 한다. 따라서 0.5 에서 소수 부분은 손실되고 0 이라는 결과를 얻게 된다. 그 다음 0 을 실수형 데이터 f 에 대입했으므로 0.0 이라는 값을 출력하는 것이다.


이럴때 원하는 결과물을 얻기 위해서 필요한 것이 강제 형 변환이다. 'float f =  a / b ;'  ----> 'float f =  (float) a / b ;' 이렇게 수정한다면 int 형 변수 a 를 float 형으로 강제 변환 하게 된다. 따라서 1.0 을 2 (int 형 변수 b) 로 나누는 꼴이 된다. 이때 자동 형 변환이 발생하게 되는데 (피연산자들 간의 자료형 통일을 위함. 데이터 손실이 적은 쪽으로 변환된다.) int 형 변수 b 도 float 형 변수 b 로 바뀌게 되는 것이다. 
결국 1.0 / 2.0 = 0.5 값을 얻게 되어 변수 f 에 대입하여 원하는 값을 출력할 수 있게 된다.


강제 형 변환은 위와 같은 산술 연산뿐만 아니라 비교연산에서 발생한다. 예전에 스모로봇 소스를 만들 때 그 당시에는 몰랐는데 나중에 그 소스를 다시 보면서 이상한점을 발견한 적이 있었다. 지금 그 소스가 어디있는 지 모르므로 비슷한 예제를 사용해보겠다.

#include <stdio.h>


int main(int argc, char **argv)
{
unsigned int i = 100;
if(i < -10)
printf("Large \n");
return 0;
}


위 소스를 실행하면 "Large"가 출력되지 않아야 정상일 것이다. 100은 당연히 -10보다 크기 때문에 if 조건문이 거짓이 되기 때문에.. 하지만 실제로는 "Large"가 잘 출력된다. 왜그럴까? 이것 또한 형 변환 때문이다. '-10' 입장에서는 'unsigned i' 를 보고 형을 일치 시켜야 하기 때문에 강제로 '-10'이 unsigned 형으로 변환 된다. 그 결과 '-10'은 2의 보수를 취해서 '4,294,967,285' 으로 된다. 이는 당연히 100 보다 크므로 "Large"가 출력 하게 되는 것이다. 실수하기 쉬운 것으로 잘 기억해 놔야겠다.


'Language > C언어' 카테고리의 다른 글

C언어 따옴표의 의미  (0) 2013.11.06
반복문 for 의 함정  (1) 2013.10.23
컴파일과 링크의 차이  (0) 2013.10.23
라이브러리와 헤더파일의 차이  (0) 2013.10.23
잘못된 포인터의 사용 1  (0) 2013.10.23
Posted by 나무길 :