> 백엔드 개발 > C++ > C 승격 규칙은 부호 있는 정수 유형과 부호 없는 정수 유형이 혼합된 이진 산술 연산자의 반환 유형을 어떻게 결정합니까?

C 승격 규칙은 부호 있는 정수 유형과 부호 없는 정수 유형이 혼합된 이진 산술 연산자의 반환 유형을 어떻게 결정합니까?

Patricia Arquette
풀어 주다: 2024-11-28 08:30:11
원래의
813명이 탐색했습니다.

How Do C   Promotion Rules Determine the Return Type of Binary Arithmetic Operators with Mixed Signed and Unsigned Integer Types?

승격 규칙이 혼합 부호 유형의 이진 연산자 산술을 제어하는 ​​방법

다음 코드를 고려하세요.

int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;
로그인 후 복사

연산자는 결과를 2147483648로 계산하며 unsigned int를 제안합니다. 반환 유형으로. 반대로 다음 코드에서는

unsigned int us = 42;
int neg = -43;
int result = us + neg;
로그인 후 복사

결과가 -1이며 이는 int 반환 유형을 나타냅니다.

승격 규칙 해결

C 표준은 산술 이진 연산자에 대한 특정 승격 규칙을 정의합니다(C §5/9):

  1. 피연산자 중 하나라도 long double이면 둘 다 long double로 변환합니다.
  2. 피연산자 중 하나라도 double이면 둘 다 double로 변환합니다.
  3. 둘 중 하나의 피연산자가 부동이면 둘 다 부동으로 변환합니다.
  4. 두 피연산자 모두에 통합 프로모션을 적용합니다. 피연산자.
  5. 두 피연산자 중 하나가 unsigned long이면 둘 다 unsigned long으로 변환합니다.
  6. 피연산자 중 하나가 long int이고 다른 피연산자는 unsigned int인 경우 가능하면 unsigned int를 long int로 변환하고, 그렇지 않으면 둘 다 unsigned long int로 변환합니다.
  7. 둘 중 하나의 피연산자가 길면 둘 다 다음으로 변환합니다. long.
  8. 두 피연산자 중 하나라도 부호가 없으면 둘 다 부호 없는 것으로 변환합니다.
  9. 두 피연산자가 모두 int이면 더 이상 변환이 발생하지 않습니다.

다음에 대한 의미 예

두 예 모두에서 프로모션 규칙은 연산자 계산을 위한 unsigned 유형.

예 1: max와 one 모두 unsigned int로 승격되어 반환 유형이 unsigned int가 됩니다.

예시 2: 승격 규칙은 int와 unsigned int 사이의 확실한 승자를 지정하지 않습니다. 그러나 부호 없는 유형이 선택되어 결과에 대해 부호 없는 오버플로가 발생합니다. 결과는 궁극적으로 int에 할당되므로 결과 값은 C §4.7/3에 따라 정의되지 않습니다.

위 내용은 C 승격 규칙은 부호 있는 정수 유형과 부호 없는 정수 유형이 혼합된 이진 산술 연산자의 반환 유형을 어떻게 결정합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿