C언어 강제 형변환 문제 ( 이 코드의 실행결과는 어떻게 나올까요?)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
/* int abs(int n); abs함수는 절댓값을 알려주는 함수 */
printf("%d %d\n", abs(4.48), abs(-5.58));
return 0;
}
이 문제에서 함수에 정수가 들어가야 되는데 실수가 들어가면 어떻게 되지? 에라 모르겠다 4, -5 나오겠지 라고 생각했다면 이 글을 제대로 읽어보시길 바란다.
답은 맨 아래에 있음!
강제 형변환
이전 글에서 암시적 형변환에 대해서 알아 봤는데, 이번에는 강제 형변환에 대해서 알아보자.
강제 형변환은 영어로 Explicit Conversion 이라고하고 개발자가 직접적으로 형(Type)을 강제로 변환시키는 과정을 말한다.
C언어에서 강제 형변환을 하는 방법
(강제할 형)변수;
(강제할 형)상수;
이런 방식으로 할 수 있다.
강제 형변환을 하는 예시 중에서는 int형 변수끼리 나눗셈을 할 때이다.
#include <stdio.h>
int main(void)
{
int num1 = 5;
int num2 = 2;
double result = num1 / num2;
printf("%f", result);
return 0;
}
이때의 코드 결과는 2.000000 이 나온다. 그 이유는 정수형 나눗셈은 몫만 결과로 나오는데 이것을 double으로 형변환 한다고 2.5 가 나오지는 않기 때문이다.
그런 이유로 result 변수에 넣어주기 전에 강제적으로 num1이나 num2를 double형으로 형변환을 시켜주면 나머지 정수형 변수는 묵시적(암시적) 형변환으로 double형으로 변하기 때문에 나눗셈 결과가 2.5가 나오게 된다!!
#include <stdio.h>
int main(void)
{
int num1 = 5;
int num2 = 2;
double result = (double)num1 / num2;
printf("%f", result);
return 0;
}
강제적 형변환을 하는 이유와 주의점
강제적 형변환을 하는 이유는 아까 전 코드처럼 int형을 미리 double형으로 강제로 변환시켜놓으면 double형으로 계산을 할 수 있기 때문에 도움이 되는 장점이 있다.
하지만 강제적 형변환은 개발자가 직접 하는 것이기 때문에 개발자가 주의를 해서 형변환을 해야 한다.
강제적 형변환을 하다가 데이터 손실이 발생할 수 있기 때문이다.
double형(8Byte)을 강제로 int형(4Byte)으로 강제 형변환을 시키면 소수점이 날아가 버린다.
ex) int number = 8.4; (8.4의 소수점 부분이 날아가고 8만 저장됨)
결론 : 강제적 형변환은 최대한 (데이터크기가 작은 자료형) -> (데이터크기가 큰 자료형)으로 해주는 것이 데이터손실이 발생하지 않고, 데이터손실이 불가피한 상황이라면 그 상황을 인지하고 사용하는 것을 추천한다.
강제적 형변환은 함수 매개변수에서도 일어난다! (문제 정답)
강제적 형변환은 함수 매개변수에서도 발생한다.
절댓값을 구해주는 함수abs()를 예를 들어보겠다.
abs()함수의 원형은 정수형 매개변수 num이 들어가서 정수형으로 출력하는 함수이다.
int abs(int num);
그런데 abs(4.52)나 abs(-5.58) 같은 수가 들어가면 어떻게 될까?
함수를 만든 개발자는 int형으로 받고 싶었지만 매개변수를 double로 넣어주면 컴파일러가 '이 함수는 정수를 받고 싶어 했으니까 강제로 int형으로 형변환시켜야지'라고 생각하고 4.52 -> 4로 -5.58을 -5로 변환시켜서 함수를 실행시킨다.
이 처럼 함수 매개변수도 강제적 형변환의 예시로써 원하지 않는 자료형을 매개변수에 넣으면 강제적으로 변환시킨다는 것을 알아두면 좋겠다.
결론
- 강제적 형변환은 개발자가 일부러 원해서 하는 것
- 강제적 형변환 할 때 데이터 손실을 조심하자
- 강제적 형변환은 함수 매개변수에서도 똑같이 일어난다!
2023.01.13 - [C언어] - [C언어]암시적 형변환 C99표준(size_t(=unsigned int) 와 int 연산할 때 형변환포함)
'C언어 > C언어' 카테고리의 다른 글
[C언어]함수 호출을 통한 스택 메모리 이해[1](by 어셈블리어) (0) | 2023.02.21 |
---|---|
[C언어]스택(Stack) 메모리 (0) | 2023.02.17 |
[C언어]함수 매개변수에 함수를 넣으면 순서대로 작동할까?(함수 매개변수의 평가순서) (0) | 2023.02.17 |
[C언어]링크(Link) 단계 (컴파일과 링크가 따로 되어있는 이유) (0) | 2023.02.16 |
[C언어][Hex]헥스편집기 HxD editor 다운로드 방법 (0) | 2023.02.16 |
댓글