* 자료형 변환
자료형의 크기
char -> short -> int -> long -> long long -> float -> double -> long double
- (오른쪽으로 갈수록 자료형의 범위가 크다)
- 형 확장 : 크기가 작은 자료형 -> 큰 자료형으로 변환할때. (ex : char -> int)
- 형 축소(타입 캐스팅) : 크기가 큰 자료형 -> 작은 자료형으로 변환할때. (ex : float -> int)
1. 자료형이 같거나 크기가 큰 쪽으로의 변환 (형 확장)
C에서 long long 자료형은 int보다 크다.(표현 범위가 넓다) 따라서 이러한 경우에는 자동으로 변환된다.
int num1 = 100;
long long num3;
num3 = num1; // int를 long long에 넣어도 자동으로 변환되므로 컴파일 에러가 없다.
2. 자료형이 작은 쪽으로의 변환 (형 축소)
float를 int에 넣게되면 자료형이 작은쪽으로의 변환이므로 컴파일 경고가 발생된다.
float num1 = 13.563f;
int num2 = num1;
>>>> warning (4244 : .......)
정수형으로 변환 될 때, 소수점 부분의 값 손실이 있으므로 컴파일 에러가 발생된다.
따라서 형 축소를 하는 경우에는, 캐스팅(명시적 자료형 변환)이 필요하다. 값은 자료형을 소괄호 안에 넣어주고 뒤에 변수나 값을 붙여주면 된다.
#include <stdio.h>
int main(void)
{
int num = 82;
float num2;
num2 = (float)num;
}
* 포인터 변환
포인터도 마찬가지로 괄호에 자료형을 넣어주면 되지만 포인터를 나타내는 * (애스터리스크)도 필요하다.
int 형 포인터 char 포인터로 변환하기
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *numPtr = malloc(sizeof(int));
char *charPtr;
*numPtr = 5;
charPtr = (char *)numPtr;
printf("%d", *charPtr);
free(numPtr);
}
# void 포인터는 자료형이 없으므로 역참조를 하기 위해서는 다른 자료형으로 캐스팅을 해야만 한다.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *numPtr = malloc(sizeof(int));
void *ptr;
*numPtr = 9;
*(int *)ptr = *numPtr;
printf("%d\n",*(int *)ptr);
free(numPtr);
}
* 구조체 포인터
#include <stdio.h>
#include <stdlib.h>
struct Da
{
char c1;
int num1;
};
int main(void)
{
struct Da *d1 = malloc(sizeof(struct Da));
void *ptr;
d1->c1 = 'b';
d1->num1 = 9;
ptr = d1;
printf("%c\n%d\n", ((struct Da *)ptr)->c1 , ((struct Da *)ptr)->num1);
free(d1);
}
구조체 포인터를 void형 포인터에 넣을때는 컴파일 경고가 없지만, 멤버에 접근할때는 컴파일 에러가 발생한다.
따라서 멤버에 접근하여 값을 출력하거나 하는 경우에는 캐스팅을 해줘야한다.