"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como as conversões aritméticas usuais determinam o tipo de resultado de operadores binários \"+\" com operandos assinados e não assinados?

Como as conversões aritméticas usuais determinam o tipo de resultado de operadores binários \"+\" com operandos assinados e não assinados?

Publicado em 2024-12-22
Navegar:235

How Do Usual Arithmetic Conversions Determine the Result Type of Binary \

Regras de promoção para operadores binários assinados e não assinados

Considere os seguintes trechos de código:

// Snippet 1
int max = std::numeric_limits::max();
unsigned int one = 1;
unsigned int result = max   one;
// Snippet 2
unsigned int us = 42;
int neg = -43;
int result = us   neg;

Como o operador " " determina o tipo de resultado correto nesses casos, dada a assinatura diferente dos operandos?

O operador segue as "conversões aritméticas usuais" regra, que determina as etapas de conversão de tipo com base nos tipos de operandos. De acordo com esta regra, se um dos operandos for:

  • long double, ambos os operandos serão convertidos em long double.
  • double, ambos os operandos serão convertidos em double.
  • float, ambos os operandos são convertidos em float.
  • unsigned long, o outro operando é convertido em unsigned long.
  • long int e o outro operando unsigned int, ambos os operandos serão convertidos em unsigned long int se o valor do unsigned int puder ser representado em um long int; caso contrário, ambos serão convertidos para longos.
  • longo, o outro operando é convertido para longo.
  • unsigned, o outro operando é convertido para não assinado.

Desde int e unsigned int são intercambiáveis ​​​​na regra, o operando com o tipo mais amplo (unsigned int) é escolhido como o tipo de resultado.

Isso explica por que em No Snippet 1, o resultado é unsigned int (2147483648) e no Snippet 2, o resultado é int (-1). O operando assinado (neg) é convertido implicitamente em unsigned int, resultando em um valor indefinido no último caso.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3