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?

Foi útil?

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.

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