A che punto si verifica un cast implicito in un'espressione C ++?
-
23-12-2019 - |
Domanda
Questa è una domanda molto semplice.Ho notato che quanto segue, se compilato in MSVS2012, produce previsto risultato di 0x3412
per val
:
unsigned char test[] = { 0x12, 0x34, 0x56, 0x78 };
unsigned char* ch = test;
unsigned int val = *ch | (*(ch+1) << 8);
.
Avrei effettivamente aspettato il dereferenced Char Pointer *(ch+1)
sul diritto di produrre un valore char di 0x34
, che verrà quindi spostato a sinistra 8 bit che producono 0x00
.Sembra che al momento del tempo il valore sia dereferenziato, è già memorizzato in un tipo abbastanza grande da contenere almeno due byte.
è specificato in c ++ standard da qualche parte?Come succede esattamente questo cast implicito?
Soluzione
Questo è coperto sotto il Draft C ++ Standard Sezione 5.8
Operatori Shift Paragrafo 1 che dice:
.[...] Gli operandi devono essere eseguiti il tipo di enumerazione integrale o senza cesputato e le promozioni integrali vengono eseguite. [...]
e promozioni integrali sono coperte da sezione 4.5
promozioni integrali quale nel paragrafo 1 dice:
.Un prvalue di un tipo intero diverso da BOOL, CHAR16_T, CHAR32_T o WCHAR_T, la cui rango di conversione integro (4.13) è inferiore al grado di int può essere convertito in un prvalue di tipo int se int può rappresentare tutti i valori diil tipo di origine;In caso contrario, la prvalue sorgente può essere convertita in un prvalue di tipo Int firmato.