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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top