Estouro de número inteiro - Por que não [duplicado]
-
14-11-2019 - |
Pergunta
Possíveis Duplicados:
Além de dois chars produz int
Dado o seguinte código em C++:
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = (a + b) / 2;
A saída é 150, logicamente o esperado, no entanto não deve haver um estouro de número inteiro na expressão (a + b)
?
Obviamente, deve haver um número inteiro promoção para lidar com o estouro aqui, ou alguma coisa está acontecendo que eu não posso ver.Eu queria saber se alguém poderia esclarecer-me, para que eu possa saber o que é que eu posso e não deveria confiar em termos de número inteiro de promoção e de excesso.
Solução
Nem C++ não C executar cálculos aritméticos dentro de "menor" tipos inteiros como, char
e short
.Estes tipos, quase sempre, ser promovido para int
antes de qualquer outra cálculos de começar.Assim, sua expressão é realmente avaliado como
unsigned char c = ((int) a + (int) b) / 2;
P. S.Em alguns exóticos plataforma, onde o intervalo de int
não cobrir a gama de unsigned char
, o tipo de unsigned int
será usado como o tipo de destino para a promoção.
Outras dicas
Não, isso não é um erro.
O compilador calcula sempre, no mínimo, do número inteiro de precisão, o resultado será convertido para unsigned char no exercício.
Este é o padrão.
Por outras respostas, não é um erro no x86 e outros (são) de 32 bits e 16 bits arquiteturas.
No entanto, em menor ou menos saudáveis arquiteturas (normalmente muito pequenos microcontroladores) coisas como essa provavelmente vai começar a causar problemas, especialmente se quem implementado o compilador não tem o teste/validação do orçamento de algumas das maiores empresas lá fora (de novo, microcontroladores).