TAKEAWAY 5.31 산술식에서 좁은 타입(narrow type)을 사용하지 않는다.
덧셈과 곱셈과 같이 피연산자가 두 개인 연산자에 적용되는 타입 규칙은 이보다 훨씬 복잡하다. 두 피연산자의 타입이 서로 다를 수 있기 때문이다. 부동 소수점 타입 연산의 예를 몇 가지 살펴보자. 첫 번째와 두 번째 예는 문제가 없다. 정수 상수 1의 값이 double이나 complex float 타입의 범위를 벗어나지 않기 때문이다. 실제로 이런 혼합 연산에서 한쪽 타입의 범위가 다른 쪽 타입의 범위 안에 포함될 때, 결과에 대한 타입은 넓은 쪽 타입을 따를 때가 많다.
1 + 0.0 // 문제 없다. double 1 + I // 문제 없다. complex float INT_MAX + 0.0F // 정밀도가 떨어질 수 있다. float INT_MAX + I // 정밀도가 떨어질 수 있다. complex float INT_MAX + 0.0 // 문제 없을 때가 많다. double
세 번째와 네 번째 예는 문제가 있다. signed int의 최댓값인 INT_MAX는 float이나 complex float의 범위를 벗어날 때가 많기 때문이다. 예를 들어 필자의 머신에서 INT_MAX + 0.0F는 INT_MAX + 1.0F와 같고 십진수로 2147483648이다. 마지막에 나온 예처럼 double 연산일 때는 대부분의 플랫폼에서 문제가 없다. 그렇지만 int가 64비트인, 현재 혹은 향후에 나올 플랫폼에서 정밀도가 떨어지는 문제가 발생할 가능성은 얼마든지 있다.