>백엔드 개발 >C++ >C 승격 규칙은 부호 있는 정수와 부호 없는 정수를 사용하여 이진 연산을 어떻게 처리합니까?

C 승격 규칙은 부호 있는 정수와 부호 없는 정수를 사용하여 이진 연산을 어떻게 처리합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-29 14:24:10536검색

How Do C   Promotion Rules Handle Binary Operations with Signed and Unsigned Integers?

부호 있는 정수와 부호 없는 정수를 처리하는 연산자의 승격 규칙

피연산자 사이의 부호가 서로 다른 이진 연산자를 처리할 때 승격 규칙은 C 표준이 적용됩니다. 이러한 규칙은 결과 연산 유형과 피연산자가 변환되는 방식을 결정합니다.

구체적으로 "일반적인 산술 변환"이 여기에 적용됩니다(§5/9). 이러한 변환은 내림차순으로 순위가 지정됩니다.

  1. Long double(있는 경우)
  2. Double
  3. Float
  4. Integral 프로모션(short/int 변환) /long long에서 int/long/long long으로)
  5. 부호 없는 long(if 현재)
  6. long int가 모든 unsigned int 값을 나타낼 수 있고 그렇지 않으면 unsigned long int를 나타낼 수 있습니다.
  7. Long(있는 경우)
  8. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.