공부했던 자료 정리하는 용도입니다.
재배포, 수정하지 마세요.
형변환
자료형의 확장과 축소
- 자동 형변환(묵시적 형변환)
1) 대입 연산의 전달 과정에서 발생하는 자동 형변환
2) 정수의 승격(Integral Promotion)에 의한 자동 형변환
3) 피연산자의 자료형 불일치로 발생하는 자동 형변환 - 강제 형변환(명시적 형변환)
자료형 변환 : 데이터의 표현 방식을 바꾸는 것
자료형의 확장과 축소
- 형 확장(type promotion)
: 자료형을 섞어서 쓰면 컴파일러에서 암시적 형변환(implicit type conversion)을 하게 되는데 자료형의 크기가 큰 쪽, 표현 범위가 넓은 쪽으로 자동 변환된다. 이를 형 확장(type promotion)이라고 하며 값이 버려지지 않고 그대로 보전된다. - 형 축소(type demotion)
: 자료형의 크기가 작은 쪽, 표현범위가 좁은 쪽으로 변환되는 것을 형 축소(type demotion)라고 한다. 형 축소가 일어나면 컴파일할 때 값의 손실이 일어날 수 있다.
형변환의 종류
- 자동 형변환(묵시적 형변환)
1. 대입 연산의 전달 과정에서 발생하는 자동 형변환
2. 정수의 승격(Integral Promotion)에 의한 자동 형변환
3. 피연산자의 자료형 불일치로 발생하는 자동 형변환 - 강제 형변환(명시적 형변환)
1. 자동 형변환(묵시적 형변환)
1. 대입 연산의 전달 과정에서 발생하는 자동 형변환
int num = 3.1415; //double형 실수 3.1415를 int형으로 자동 형변환(3)
char ch = 129; //int형 리터럴인 129를 char형으로 자동 형변환(-127)
대입 연산자의 왼편과 오른편에 존재하는 두 피연산자의 자료형이 일치하지 않으면 왼편에 있는 피연산자를 대상으로 형 변환이 자동으로 일어난다. 그러나 위의 코드처럼 데이터의 표현 범위가 좁은 자료형으로의 형변환은 데이터 손실이 발생할 수 있으니 주의해야 한다.
- 정수 → 실수 : 값 손실 x (실수이기 때문에 오차는 존재함)
- 실수 → 정수 : 소수점 이하의 값 손실
- byte 크기가 큰 정수 → byte 크기가 작은 정수
: 변환하고자 하는 정수의 byte 크기에 맞춰서 상위 byte를 소멸시킴 (이로 인해 부호가 바뀌는 경우도 있으니 주의)
2. 정수의 승격(Integral Promotion)에 의한 자동 형변환
일반적으로 CPU가 처리하기에 가장 적합한 크기의 정수 자료형이 ``int``형이기 때문에 ``int``형 연산의 속도가 다른 자료형의 연산속도에 비해서 동일하거나 더 빠르다. 그래서 ``int``보다 작은 크기의 정수형 데이터는 ``int``형으로 형변환 되어 연산이 진행된다. 이러한 형변환을 '정수의 승격(Integral Promotion)'이라고 한다.
3. 피연산자의 자료형 불일치로 발생하는 자동 형변환
CPU는 같은 자료형의 두 피연산자를 대상으로만 연산이 가능하도록 설계되어 있어 피연산자의 자료형이 서로 다른 경우 자동으로 형변환이 일어난다. 이때 형변환은 데이터의 손실을 최소화하는 방향으로 진행된다.
2. 강제 형변환(명시적 형변환)
형 변환 연산자를 이용해서 강제로 형 변환을 명령하는 것을 명시적 형변환이라고 한다. 형변환에 사용되는 소괄호`` ( ) ``를 가리켜 '형변환 연산자(type casting operator)'라고 하며, 연산의 결과로 변환된 값이 반환된다.
#include <stdio.h>
int main(void)
{
int num1 = 3, num2 = 4;
double divResult;
divResult = num1 / num2 ;
//divResult = (double)num1 / num2;
printf("나눗셈 결과 : %f \n", divResult);
return 0;
}
``int``형끼리 나눗셈을 할 경우 결과값도 ``int``형으로 나와 소수점 밑의 자리가 손실된다.
꼭 실수로 형변환을 해준 뒤에 연산을 해야 원하는 결과를 얻을 수 있다.
'기타 > C' 카테고리의 다른 글
[C] 함수 (0) | 2020.04.27 |
---|---|
[C] 조건문, 반복문 (0) | 2020.04.16 |
[C] printf, scanf 함수 (0) | 2020.04.09 |
[C] 데이터 표현 방식, 기본 자료형과 상수 (0) | 2020.04.07 |
[C] 함수, 변수, 연산자 (0) | 2020.04.03 |