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.

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top