TAKEAWAY 5.22 같은 값이라도 타입이 서로 다를 수 있다.
팔진수나 십육진수 상수의 타입을 결정하는 과정은 다소 복잡하다. 부호 있는 타입의 범위를 벗어난 값이 부호 없는 타입이 될 수도 있다. 앞에서 본 예제에서 십육진수 상수인 0x7FFF는 십진수로 32767이므로 signed 타입이 된다. 반면, 십육진수 상수인 0x8000는 십진수로 32768이어서 unsigned 타입이 되고, -0x8000도 마찬가지로 unsigned가 된다.Exs 2
TAKEAWAY 5.23 음수 값은 팔진수나 십육진수 상수로 표현하지 않는다.
따라서 음수 값을 갖는 상수를 표현하려면 한 가지 방법밖에 없다.
TAKEAWAY 5.24 음수 값은 십진수 상수로 표현한다.
정수형 상수를 부호 없는 타입이나 너비가 최소인 타입으로 만들 수 있는데, 상수 값을 나타내는 리터럴 뒤에 U, L, LL 등을 붙이면 된다. 예를 들어 1U라고 적으면 값은 1이고 타입은 unsigned가 된다. 1L은 signed long이고, 1ULL이라고 적으면 값은 1L과 마찬가지로 1이지만 타입은 unsigned long long이 된다.Exs 3 여기서 주목할 점은 C 언어의 상수(예 1ULL)를 표현하는 글씨체와 값(예 1)을 표현하는 글씨체를 다르게 적용했다는 것이다.
십육진수 상수에 signed 타입을 적용하여 음수를 표현하는 실수를 하는 경우가 많다. 예를 들어 int x = 0xFFFFFFFF라고 선언했다고 하자. 이 십육진수 값이 바이너리 표현으로는 -1과 같다는 생각에 이렇게 적을 수 있다. 실제로 32비트 signed 타입을 지원하는 아키텍처는 그런 경우가 많다(모두 그런 것은 아니다). 하지만 +4294967295가 항상 -1로 변환되는 것은 아니다. 표 5-3에서 값과 타입이 특이한 상수의 예를 볼 수 있다.
Exs 2 unsigned의 최댓값이 216 - 1이어도 -0x8000는 32768임을 보여라.
Exs 3 -1U, -1UL, -1ULL로 지정하면 각각 승격되지 않은 부호 없는 타입으로 최댓값을 갖는다는 것을 보여라.