int형 데이터와 float형 데이터에 대한 연산, 즉 서로 다른 데이터형에 대한 연산은 이루어지지 않는다. 내부에서의 표현하는 방식이 전혀 다르기 때문이다. 그러나, 언어에서는 서로 다른 데이터형일 때, 작은 크기의 데이터형을 큰 데이터형으로 변호나해 연산을 할 수 있게 해준다. C언어도 해당된다.
음… 예시 코드에도 사용했던 것인데, 예시를 살펴본다.
char형은 1바이트이고, int형은 4바이트로 표현된다.
char | 01100001
int | 00000000000000000000000100000000
이 둘을 연산하기 위해서는 이 둘의 크기가 같아야 연산을 할 수 있는데, int형의 사이즈를 줄이면 데이터가 잘릴 수 있기 때문에 char형을 늘려야 한다. 데이터 형을 늘릴 때에는 앞자리를 전부 0으로 채운다.
char | 00000000000000000000000001100001
int | 00000000000000000000000100000000
이렇게 하여 둘을 연산한 결과는 int형태로 되어 연산이 된다. 실행 결과는 아래와 같다.
이런 연산 시 데이터형 자동변환에는 규칙이 있다. 규칙에 대해서는 다음과 같다.
- long double형이 있으면, 다른 피연산자를 long double형으로 변환하다.
- 그렇지 않고 double형이 있으면, 다른 피연산자를 double형으로 변환한다.
- 그렇지 않고 float형이 있으면, 다른 피연산자를 float형으로 변환한다.
- 그렇지 않고 (unsigned) long형이 있으면, 다른 피연산자를(unsigned) long형으로 변환한다.
- 그렇지 않고(unsigned) int형이 있으면, 다른 피연산자를(unsigned) int형으로 변환한다.
- 그렇지 않으면 char형 또는 short형을 int 형으로 변환한다.
이게 왜 이렇게 되는지는 컴퓨터 구조에서 숫자 연산 과정을 살펴보면서 이 규칙을 보면 잘 이해가 될 것이다. (이래서 기본 이론이 진짜 중요하다.)
그리고 C언어에서는 사용자가 임의로 현 변환을 할 수 있다. (다른 언어도 마찬가지) 이 때 사용하는 연산자가 캐스트 연산자이다. 변환하려는 변수 앞에 괄호를 처리하여 바꾸려는 형을 작성해준다. 아래의 예시를 보면, 10.7과 30.8같은 소수점 연산자를 int형으로 변환하였다.