C 언어는 많은 사업자에 대해 "일반적인 산술 변환"을 수행 - 변환은 C99 표준의 6.3.1.8에 요약되어 있습니다. 정수형 피연산자의 경우 첫 번째 프로모션이 수행되며 이는 사용자의 문제를 유발합니다. int로 원래 유형의 모든 값을 나타낼 수있는 경우
, 값은 변환됩니다 : 프로모션은 다른 것들 사이 말한다 (산술 연산자/부울, 문자 및 정수), 6.3.1.1에 설명되어 있습니다 int; 그렇지 않으면 unsigned int로 변환됩니다. 이것을 정수 승격이라고합니다. 다른 모든 유형은 정수 승격에 의해 변경되지 않습니다.
프로모션은 int
unsigned int
및 (또는 비트 필드)보다 낮은 순위 정수형 개체 또는 식에만 적용된다. 그래서 exression에
:
t1 < t2-1
변수들이 플랫폼에 int
이 unsigned short
의 모든 값을 나타낼 수 있기 때문에, int로 승진 unsigned short
에도 불구하고. 따라서 표현식은 int
유형을 사용하여 계산되며 언더 플로우는 발생하지 않습니다. 표현식의 t2-1
부분은 음수 1로 끝납니다.식에
는 : 그들이
int
/
unsigned int
보다 더 높은 '순위'를 가지고 있기 때문에 표현이에서 언더 플로로 (부호없는 산술을 사용하여 평가되도록
s1 < s2-1
unsigned long
유형이 촉진되지 않는다 빼기) s2-1
부 표현식은 음수가 아닌 매우 큰 수로 평가됩니다.
설명에 litb가 표시되어있는 경우 플랫폼에 int
이 구현 된 경우 (허용되는 경우 - MS-DOS 용) 예), 프로 int
은 unsigned short
(unsigned short
은 16 비트 이상이어야 함)의 모든 값을 나타낼 수 없으므로 unsigned short
의 동작은 int
대신에 unsigned int
이됩니다. 이 경우 if
문은 모두 참으로 평가됩니다.
~ nairboon : 편집 하시길 바랍니다. 내가 대신 작성한 코드는 기능적으로 동일하지만 편집기로 복사/붙여 넣기가 가능하며 변경없이 컴파일 할 수 있습니다. –
이 결과는 결과가 보장되지 않습니다. int가 short와 같은 값의 범위를 저장하는 머신에서 (16 비트 머신은 생각할 것입니다.), 양쪽 모두에 대해 출력이 표시됩니다. 왜냐하면 프로모션이 int가 아닌 unsigned int로 변환되기 때문입니다. –