Promozioni a intero
Gli oggetti di un tipo integrale possono essere convertiti in un tipo integrale più ampio, ovvero in un tipo in grado di rappresentare un più ampio set di valori. Tale conversione widening viene denominata "promozione a intero." Con la promozione a intero, è possibile utilizzare quanto segue in un'espressione ogni qual volta sia possibile utilizzare un altro tipo integrale:
Oggetti, valori letterali e costanti di tipo char e short int
Tipi di enumerazione
int campi di bit
Enumeratori
Le promozioni di C++ sono a "mantenimento del valore." Ciò significa che si ha la certezza che il valore, in seguito alla promozione, sia identico al valore antecedente la promozione. Nelle promozioni a mantenimento del valore, gli oggetti di tipi integrali più brevi (come i campi di bit o gli oggetti di tipo char) vengono promossi al tipo int, se int è in grado di rappresentare la gamma completa del tipo di origine. Se int non è in grado rappresentare la gamma completa dei valori, l'oggetto viene promosso al tipo unsigned int. Sebbene questa strategia sia identica a quella utilizzata da ANSI C, le conversioni a mantenimento del valore non mantengono il "segno" dell'oggetto.
Le promozioni a mantenimento del valore e le promozioni che mantengono il segno producono, in genere, gli stessi risultati. Possono, però, produrre risultati diversi qualora l'oggetto promosso sia uno dei seguenti:
Operandi di /, %, /=, %=, <, <=, > o >=
Questi operatori si basano sul segno per determinare il risultato. Di conseguenza, le promozioni a mantenimento del valore e le promozioni che mantengono il segno portano a risultati diversi, se applicate a tali operandi.
Operando sinistro di >> o >>=
Questi operatori trattano le quantità con segno e quelle senza segno in maniera differente, quando si esegue un'operazione di spostamento. Nel caso delle quantità con segno, spostare una quantità a destra comporta la propagazione del bit di segno verso le posizioni di bit vuote. Nel caso delle quantità senza segno, le posizioni di bit vuote vengono riempite con zero.
Argomento in una funzione in overload o operando di un operatore di overload che dipende dal segno del tipo dello stesso operando per corrispondere all'argomento. Per ulteriori informazioni sulla definizione di operatori di overload, vedere Operatori di overload.