>백엔드 개발 >C++ >C는 부호가 다른 이진 연산자 승격을 어떻게 처리합니까?

C는 부호가 다른 이진 연산자 승격을 어떻게 처리합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-02 08:00:13867검색

How Does C   Handle Binary Operator Promotion with Differing Signedness?

부호가 다를 때 이진 연산자 승격

이진 연산자가 부호가 다른 피연산자에서 작동하는 경우 C 표준은 승격을 결정하기 위한 구체적인 지침을 제공합니다. 규칙과 결과 유형.

표준의 섹션 5/9에 "일반적인 이러한 연산자에 적용되는 산술 변환'을 참조하세요. 이러한 변환은 계층적 순서를 따릅니다.

  1. 피연산자 중 하나가 long double이면 두 피연산자 모두 long double로 변환됩니다.
  2. 피연산자 중 하나라도 double이면 두 피연산자 모두 double로 변환됩니다.
  3. 두 피연산자 중 하나가 부동 소수점이면 두 피연산자 모두 부동 소수점으로 변환됩니다.
  4. 적분 승격은 두 피연산자 모두에서 수행됩니다.
  5. 두 피연산자 중 하나가 unsigned long이면 두 피연산자 모두 unsigned long으로 변환됩니다.
  6. 한 피연산자는 long int이고 다른 피연산자는 unsigned int이면 long인지 확인합니다. int는 unsigned int의 모든 값을 나타낼 수 있습니다. 그렇다면 unsigned int를 long int로 변환하세요. 그렇지 않으면 두 피연산자를 모두 unsigned long int로 변환합니다.
  7. 두 피연산자 중 하나가 길면 두 피연산자 모두 long으로 변환됩니다.
  8. 두 피연산자 중 하나라도 부호가 없으면 두 피연산자는 모두 부호 없는 것으로 변환됩니다.
  9. 그렇지 않으면 두 피연산자 모두 유형이 유지됩니다. int.

제공된 코드 예제에 다음 규칙 적용:

예 1:

unsigned int one = 1;
int max = std::numeric_limits<int>::max();
unsigned int result = max + one;

unsigned int가 우선하므로 int 규칙의 5단계에서는 모든 피연산자가 unsigned int로 변환됩니다. 따라서 결과는 unsigned int 유형입니다.

예 2:

unsigned int us = 42;
int neg = -43;
int result = us + neg;

이 경우 규칙에 따라 두 피연산자는 모두 unsigned int로 변환되어야 합니다. 그러나 결과 값(-1)은 unsigned int로 표현할 수 없습니다. 따라서 표현식의 결과 유형은 §4.7/3에 따라 구현 정의됩니다.

위 내용은 C는 부호가 다른 이진 연산자 승격을 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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