부호 있는 정수와 부호 없는 정수를 처리하는 연산자의 승격 규칙
피연산자 사이의 부호가 서로 다른 이진 연산자를 처리할 때 승격 규칙은 C 표준이 적용됩니다. 이러한 규칙은 결과 연산 유형과 피연산자가 변환되는 방식을 결정합니다.
구체적으로 "일반적인 산술 변환"이 여기에 적용됩니다(§5/9). 이러한 변환은 내림차순으로 순위가 지정됩니다.
- Long double(있는 경우)
- Double
- Float
- Integral 프로모션(short/int 변환) /long long에서 int/long/long long으로)
- 부호 없는 long(if 현재)
- long int가 모든 unsigned int 값을 나타낼 수 있고 그렇지 않으면 unsigned long int를 나타낼 수 있습니다.
- Long(있는 경우)
- Unsigned(있는 경우)
이 규칙을 두 가지 시나리오에 적용 제시됨:
시나리오 1:
int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;
- max는 signed int이고 하나는 unsigned int입니다.
- 통합 프로모션이 발생하여 max as int
- unsigned int의 순위가 높으므로 결과 유형은 is unsigned int
- 결과: 2147483648에 대한 unsigned 오버플로
시나리오 2:
unsigned int us = 42;
int neg = -43;
int result = us + neg;
- us is unsigned int, neg가 서명되었습니다 int
- 적분 승격이 발생하여 우리는 unsigned int, neg는 int가 됩니다.
- unsigned int의 순위가 높으므로 결과 유형은 unsigned int
- 그러나 값은 우리 중 부정(-1)은 int로 표현할 수 없습니다
- 결과: 구현 정의 동작, 아마도 -1 반환 또는 플랫폼에 따라 다름
위 내용은 C 승격 규칙은 부호 있는 정수와 부호 없는 정수를 사용하여 이진 연산을 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!