지난 시간에 이어서 이번 포스팅 역시 C 기본 자료형을 이해해보도록 하겠습니다. 지난번 포스팅은 아래 링크를 참고해주세요.
https://gksid102.tistory.com/91?category=910371
5. 상수
자료형은 변수뿐만 아니라 상수를 위해서도 존재합니다. 상수 역시 앞서 설명한 int, double과 같은 자료형을 근거로 표현됩니다.
위 코드를 단계별로 정리하면 다음과 같습니다.
- step1 : 실수 3.11과 5.22가 메모리 공간에 상수의 형태로 저장된다.
- step2 : 두 상수를 기반으로 덧셈이 진행된다.
- step3 : 덧셈의 결과로 얻어진 상수 8.33이 변수 num에 저장된다.
그런데 위 코드를 컴파일하면 다음과 같은 경고 문구가 발생합니다.
초기화할 때, double형 데이터를 float형 변수에 저장하였으니, 데이터가 잘려나갈 수도 있다는 문구입니다. 이러한 경고가 발생하는 이유는 상수 저장에 있어서 int형으로 표현 가능한 정수형 상수는 int형으로 메모리 공간에 저장되고, double형으로 표현 가능한 실수형 상수는 double형으로 저장되기 때문입니다. 위의 코드에서 3.11+5.22는 8바이트 크기의 double형 상수이고, 변수 num은 4바이트 크기의 float형 변수이므로, 이러한 경고 메시지가 뜨는 것입니다.
float형 상수를 float형 변수에 저장하려면 아래와 같이 float형을 의미하는 f를 상수의 뒤에 붙여주면 됩니다. (대문자 F도 가능합니다.)
이렇듯 C언어는 다양한 자료형의 상수를 표현할 수 있도록 다음과 같이 접미사를 정의하고 있습니다. 역시 크게 정수형과 실수형으로 나뉩니다. 참고로 아래의 접미사들은 대소문자를 구분하지 않습니다.
접미사 | 자료형 |
U | unsigned int |
L | long |
UL | unsigned long |
LL | long long |
ULL | unsigned long long |
F | float |
L | long double |
6. 자료형의 변환
자료형의 변환이라는 것은 데이터의 표현방식을 바꾸는 것을 의미합니다. 크게 자동 형 변환과 강제 형 변환으로 나뉘고, 다음과 같이 형 변환이 발생하는 네가지 경우가 있습니다.
(i) 대입연산의 전달과정에서 발생하는 자동 형 변환
첫 번째 경우는 정수를 실수로 형 변환하는 경우입니다. 실수의 표현범위가 정수보다 넓기 때문에 데이터 손실은 일어나지 않지만 실수의 표현이기 때문에 오차는 존재할 수도 있습니다.
두 번째 경우는 실수를 정수로 형 변환하는 경우입니다. 이때는 소수점 이하의 값이 버려지므로 데이터 손실이 일어납니다.
마지막 경우는 바이트 크기가 큰 정수를 바이트 크기가 작은 정수로 형 변환하는 경우입니다. 변환하고자 하는 정수의 바이트 크기에 맞춰서 상위 바이트를 단순히 소멸시킵니다. 다만 이로 인해서 부호가 바뀔 수 있으니 주의가 필요합니다.
아래는 차례대로 세 가지 경우를 보여준 예시입니다.
(ii) 정수의 승격에 의한 자동 형 변환
저번 포스팅에서 일반적으로 CPU가 처리하기에 가장 적합한 크기의 정수 자료형은 int라고 하였습니다. 따라서 int보다 작은 크기의 정수형 데이터는 int형 데이터로 형 변환이 되어서 연산이 진행됩니다. 즉, 다음과 같은 경우에도 int형으로의 자동 형 변환이 발생합니다.
(iii) 피연산자의 자료형 불일치로 발생하는 자동 형 변환
위 예시에서
double num1 = 1.11 + 2;
문장을 봅시다. 이 문장에서는 실수형 데이터 1.11과 정수형 데이터 2의 합을 요구하고 있습니다. 그런데 정수와 실수는 근본적으로 표현방식이 다르므로 사실상 덧셈이 불가능합니다.(CPU는 같은 자료형의 두 피연산자를 대상으로만 연산이 가능하도록 설계되어 있습니다.) 따라서 이 경우에는 정수 2를 실수 2.0으로 형 변환하여 연산을 진행합니다. 이렇듯, 피연산자의 자료형이 일치하지 않아서 발생하는 자동 형 변환은 데이터의 손실을 최소화하는 방향으로 진행됩니다. 데이터 손실의 최소화 기준은 다음과 같습니다. 여기서 볼 수 있듯이 형 변환의 우선순위는 정수 자료형보다 실수 자료형이 무조건 앞서는 형태로 정의되어 있습니다.
int < long < long long < float < double < long double
위 부등호는 예를 들어 int형 정수와 long형 정수를 대상으로 덧셈연산을 하는 경우, 화살표의 방향에 따라서 int형 정수가 long형 정수로 자동 형 변환된다는 것을 나타냅니다.
(iv) 명시적 형 변환 : 강제로 일으키는 형 변환
위 예제에서 1/2의 나눗셈 결과가 0.000000이 나온 것을 볼 수 있습니다. 그 이유는 연산결과의 자료형은 피연산자의 자료형과 일치하기 때문입니다. 나눗셈의 결과는 0이 되고(정수형 나눗셈 결과의 몫), 이 값이 double형으로 자동 형 변환되어 변수 result에 저장됩니다. 따라서 위와 같은 출력결과가 나타났습니다.
우리가 원하는 결과값을 도출해내기위해서는 강제 형 변환이 필요합니다. 즉, 변수 num1과 num2에 저장된 값을 double형으로 변환하라는 명령어가 필요합니다. 이때 사용되는 연산자를 형 변환 연산자라고 하며, 연산의 결과로는 변환된 값이 반환됩니다. 아래 예시에서 변수 앞 소괄호를 형 변환 연산자라고 합니다.
형 변환 연산자를 이용해서 num1의 형을 int에서 double로 변환시켰습니다. num2에 저장된 값도 앞의 case(iii)로 인해 double형으로 자동 형 변환됩니다. 그렇게 하여 나눗셈이 진행되고, 그 결과가 변수에 저장됩니다. 따라서 저장되는 값은 0.5가 되는 것입니다.
참고자료 : 윤성우, 「열혈 C프로그래밍」, ORANGE MEDIA, 2013
'프로그래밍 > C 언어 기초' 카테고리의 다른 글
5. C 기본 자료형 이해하기 (C정수형, C실수형, 자료형크기, sizeof, 문자형, 아스키코드) (0) | 2021.09.24 |
---|---|
4. C 비트연산자(연산자 &, |, ^, ~, <<, >>, and, or, xor, 비트 반전, 비트 이동) (2) | 2021.09.24 |
3. C 데이터 표현방식 이해하기1 (2진수, 10진수, 16진수, 2진수 10진수구하기, 비트, 바이트) (0) | 2021.08.05 |
2. C 연산자와 변수 (C변수선언, C연산자, C 수학연산, C 산술, C산수, 비교, 논리, and, or) (0) | 2021.07.26 |
1. C언어의 기본 (C언어 시작하기, C파일생성, 소스코드, C기본코드, C언어 함수, C주석) (0) | 2021.07.20 |