Pregunta

Ésta es una pregunta muy sencilla.Noté que lo siguiente, cuando se compila en MSVS2012, produce el esperado consecuencia de 0x3412 para val:

unsigned char test[] = { 0x12, 0x34, 0x56, 0x78 };
unsigned char* ch = test;
unsigned int val = *ch | (*(ch+1) << 8);

De hecho, hubiera esperado el puntero de carácter sin referencia *(ch+1) sobre el derecho a producir un carbonizarse valor de 0x34, que luego se desplazaría 8 bits hacia la izquierda produciendo 0x00.Parece que en el momento en que se elimina la referencia al valor, ya está almacenado en un tipo lo suficientemente grande como para contener al menos dos bytes.

¿Está esto especificado en el C++ estándar en alguna parte?¿Cómo ocurre exactamente este reparto implícito?

¿Fue útil?

Solución

Esto está cubierto por la NORREO DE C ++ sección 5.8 operadores de turnos párrafo 1 que dice:

[...] los operandos serán de tipo de enumeración integral o sin copa y se realizan promociones integrales. [...]

y Promociones integrales están cubiertas en la sección 4.5 Promociones integrales que en el párrafo 1 dice:

un precio de un tipo entero que no sea Bool, char16_t, char32_t o war_t cuyo rango de conversión de entero (4.13) es menor que el rango de INT se puede convertir a un prvalue de tipo INT si INT puede representar todos los valores deel tipo de fuente;De lo contrario, la fuente PRVALUE se puede convertir a un PRVALUE DE TIPO INTSIGNADO INT.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top