5.4 암묵적 변환
예제에서 본 것처럼 피연산자의 타입에 의해 연산자 표현식의 타입이 결정된다. 가령 -1은 signed int인 반면, -1U는 unsigned int가 된다. 초보자는 -1U가 unsigned int라는 점이 의외라고 생각할 수 있는데, unsigned int는 음수가 없으므로 -1U는 값이 큰 양수가 된다.
TAKEAWAY 5.29 단항 연산자인 -와 +의 타입은 승격된 인수 타입을 따른다.
따라서 이런 연산자는 대체로 타입이 변하지 않는다. 변하더라도 C의 암묵적 변환(implicit conversion) 규칙을 따른다. 다시 말해 이는 특정한 타입의 값을 다른 타입으로 변환할 때 적용되는 규칙이다. 다음 예를 살펴보자. 앞에서와 마찬가지로 이번에도 signed int의 최솟값과 최댓값이 각각 -2147483648과 2147483648이라고 가정했다.
double a = 1; // 문제 없음. 타입에 맞는 값이다. signed short b = -1; // 문제 없음. 타입에 맞는 값이다. signed int c = 0x80000000; // 위험. 지정된 타입을 벗어나는 값이다. signed int d = -0x80000000; // 위험. 지정된 타입을 벗어나는 값이다. signed int e = -2147483648; // 문제 없음. 타입에 맞는 값이다. unsigned short g = 0x80000000; // 정보 손실 발생. 0이 된다.
여기서 a와 b를 초기화하는 데는 아무 문제가 없다. 각각의 값이 주어진 타입의 범위를 벗어나지 않는다. 따라서 C 컴파일러는 타입을 암묵적으로 변환할 수 있다.