C언어

[C언어] 데이터 타입 / 형 변환

Teodore 2023. 1. 10. 20:42
728x90

오늘은 데이터 타입과 형 변환에 대해 적어보려고 한다. 

 

먼저 아래 코드를 보자 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void main(void){
    unsigned char c = 0xff;
    printf("%s\n", c==0xff?"true":"false");
}
 
void main(void){
    signed char c = 0xff;
    printf("%s\n", c==0xff?"true":"false");
}
 
void main(void){
    char c = 0xff;
    printf("%s\n", c==0xff?"true":"false");
}
cs

3가지 케이스 모두 true가 나오지 않을 것이란 것은 감으로 알고 있지만

정확히 어떤 코드가 참이고 어떤 코드가 거짓을 나타낼지 확신하긴 어려울 수 있다. 

 

정답은, true, false, false 이다. 

이것은 실무에서 작업시 흔히 저지르는 실수 중 하나로 자동 형 변환 규칙에 대해 반드시 숙지해야 한다. 

상수형태의 숫자는 signed int로 변환되므로 0xff는 int type이다. 그리고 비교를 위해 사용된 c는 승격되어 

int형태로 형변환이 이루어진다. 

 

이때 signed char, char는 모두 부호가 있는 타입이므로 0xff는 -1을 의미하므로 int형태의 -1인 0xffffffff로 표시되고

이는 0xff와 다른 값이므로 false가 된다. 

 

★ 변경 규칙 정리

연산 요소들의 타입이 다른 경우 큰 타입에 맞춰 자동 형 변환이 이루어 진다. 

(char) a + (int) b => (int) a + (int) b

대입 규칙의 경우 대입하고자 하는 변수 타입으로 자동 형 변환이 이루어진다.

(char) a = (int) b + (int) c => (char) a = (char)((int) b + (int) c)

함수 호출시 전달되는 인수는 함수 인수 타입으로 자동 형 변환이 이루어 진다.

void func(double a);

float f;

func(f) => func((double)f)

강제 캐스팅을 하는 경우는 모두 아실 것이고, 마지막으로 하나만 더 짚고 넘어가자면, 

float type의 인수는 존재하지 않습니다. void func1(float f)는 void func1(double) 형태로 변경됩니다.

 

오늘은 여기까지

728x90