승진(Promotions)
작은 집에 있는 짐을 큰 집에 넣으면 다 넣을 수 있듯이.
큰 자료형에 작은 자료형을 넣어도 큰 문제는 없다.
int main()
{
short s = 64;
int i = s;
float f = 3.14f;
double d = f;
}
강등(Demontion)
작은 자료형에 다가 더 큰 자료형을 대입하려는 시도를 Demotion이라고 한다.
int main()
{
float f;
double d;
d = 1.25;
f = 1.25;
f = 1.123;
}
디버깅 하면 이런 식으로 나온다.

작은 상자에 다가 큰 상자를 넣으면 truncation이 발생한다고 한다.
- 접미사 f를 안 쓰면 소수는 웬만하면 double 자료형이다.
- 다만, 1.25는 오류가 안 뜬다. 1 / 2^n은 컴퓨터가 정밀하게 표현할 수 있는 수이기 때문.
- truncation : 절삭
Conversion Rank
실수형 > 정수형
따라서, 정수와 실수를 더하면 정수를 실수로 변환시킨 다음 실수끼리 더한다.
1. 실수형
long double > double > float
2. 정수형
unsigned long long, long long
unsigned long, long
unsigned, int
short int, unsigned short int
sigend char, char, unsigned char
bool
※정수형에서 같은 줄에 있는 자료형은 크기가 같다.
자동 형 변환 (Automaitc Promotion of Fuction Arguments)
예외로 자동적으로 형 변환을 해주는 것이 있다.
1. 원형이 없는 함수- Functions without prototypes (C99 도입 이후 잘 안 쓰인다.)
#include <stdio.h>
void myFunction(); // 함수 원형 없음
int main() {
char c = 'A';
float f = 3.14f;
myFunction(c, f);
return 0;
}
void myFunction(c, f)
char c; // 자동으로 int로 변환
float f; // 자동으로 double로 변환
{
printf("c: %d, f: %f\\n", c, f);
}
이것은 원형 함수가 무엇인지 chat gpt에게 물어보았다.
함수 원형이 없으면, 컴파일러는 함수가 어떤 자료형의 인수를 받을 지 알 수 없다.
따라서, C언어는 기본적으로 작은 자료형(char, short, float)를 더 큰 자료형 int, double로 자동 Promotion 시켜서 일관성을 유지한다.
따라서, 함수 호출 시 예키지 못한 동작들을 방지 할 수 있다.
- 약간 int_max와 역할이 비슷해 보인다.
char이나 short 자료형은 int로 자동 변환 그리고 float 자료형은 double로 자동 변환한다.
이를 Default Argument Promotion라고 부른다고 한다.
2. 가변 인수 함수 - Variadic function
인수의 개수가 고정되지 않은 함수를 말함. 이유도 위와 비슷함.
예를 들어 printf 뒤에 콤마(,) 다음 여러 개의 인수를 받을 수 있는 것들을 말함.
앞에서 배웠듯이 printf에서 %lf로 안 쓰고 %f만 써도 double 자료형이 잘 출력되는 이유가 이런 이유이다.
캐스팅 연산자 (Casting Operator)
12:17 예시 보기
컴파일러가 자동으로 형 변환하는 거는 프로그래머의 의도가 불명확하다.
이 사람이 실수로 놓친 건지, 아니면 일부러 그렇게 납둔 건지.. 구분 할 수 가 없다.
따라서 우리가 형변환을 할 거다! 라고 의도적으로 표현을 할 때, Casting Operator을 사용한다.
예시 1)
d = (double)3.14f;
float i;
i = 1.6 + 1.7; → 3
i = (int)1.6 + (int)1.7 → 2
자료형에 따라서 결과값이 크게 달라질 수 있음.
강의 17:13부분에
0b는 2진수를 표현하기 위한 리터럴 일 뿐 딱히 신경 안 써도 된다.
'배운 것들 메모 > 따라 배우는 C언어' 카테고리의 다른 글
[홍정모의 따라하며 배우는 C언어] 6.3 진입조건 루프(Entry-Condition Loop) while (0) | 2024.09.26 |
---|---|
[홍정모의 따라하며 배우는 C언어] 6.1 while 반복 루프에서 scanf()의 반환값 사용하기 (0) | 2024.09.12 |
[홍정모의 따라하며 배우는 C언어] 5.9 표현식(Expressions)과 문장(Statements) (0) | 2024.09.10 |
[홍정모의 따라하며 배우는 C언어] 5.8 증가(++), 감소(—) 연산자 (0) | 2024.09.09 |
[홍정모의 따라하며 배우는 C언어] 5.7 나머지 연산자(Modulues Operator) (0) | 2024.09.03 |