Em que ponto uma conversão implícita acontecer em uma expressão de C++?
-
23-12-2019 - |
Pergunta
Esta é uma pergunta muito simples.Eu notei que o seguinte, quando compilado no MSVS2012, produz o o esperado resultado 0x3412
para val
:
unsigned char test[] = { 0x12, 0x34, 0x56, 0x78 };
unsigned char* ch = test;
unsigned int val = *ch | (*(ch+1) << 8);
Eu teria, na verdade, esperava que o cancelou a referência ponteiro char *(ch+1)
sobre o direito de produzir uma char valor de 0x34
, o que seria, então, deslocado para a esquerda 8 bits de produção 0x00
.Parece que no momento em que o valor é diferenciado, já é armazenado em um tipo de grande o suficiente para conter, pelo menos, dois bytes.
Isso é especificado no C++ padrão em algum lugar?Como funciona essa conversão implícita acontecer?
Solução
Isso é abordado sob a minuta padrão de C++ seção 5.8
Shift operadores parágrafo 1 que diz:
[...]Os operandos devem ser do integral ou sem escopo tipo de enumeração e integral promoções são realizadas.[...]
e integral promoções são abordados na seção 4.5
Integral promoções que no parágrafo 1 diz:
Um prvalue de um tipo de número inteiro diferente bool, char16_t, char32_t, ou wchar_t cuja conversão de inteiro rank (4.13) é menor do que a classificação de int pode ser convertido para um prvalue do tipo int, se int pode representar todos os valores do tipo de fonte;caso contrário, a fonte prvalue pode ser convertido para um prvalue do tipo unsigned int.