2011-09-24 15 views
10

C'è Codice:L'aggiunta di due variabili unsigned char e int risultato è

#include <iostream> 
int main(){ 
    unsigned char a = 4, b = 255; 
    int g = (unsigned char)a + (unsigned char)b; 
    std::cout << g << std::endl; 
    return 0; 
} 

Risultato:

259 

Perché il risultato è 259, non è 3? Se si aggiungono due variabili unsigned char, ci dovrebbe essere troppo pieno, risultato dovrebbe essere di 3 e poi si deve convertire da char unsigned int 3 a 3.

risposta

14

L'operazione di aggiunta per prima promote suoi operandi a int, prima di fare l'aggiunta . Ecco come funziona C. Se si desidera troncare, è necessario assegnare di nuovo in un tipo più ristretto, come ad esempio unsigned char.

6

aritmetica intera non viene mai eseguita sui tipi di dati più piccoli di int. Ad esempio, per i tipi di dimensioni inferiori int esempio se vengono aggiunti due tipi char e short int, questi vengono promossi a int prima di qualsiasi operazione aritmetica e il risultato è un tipo intero. Se uno dei tipi è più grande di int e.g long long int e int allora int viene promosso a long long int e il risultato è long long int.

(§ 4.5/1) - Un rvalue di tipo char, char firmato, char unsigned, short int o unsigned short int può essere convertito in un rvalue di tipo int se int può rappresentare tutte le valori del tipo di fonte; altrimenti, il rvalue sorgente può essere convertito ad un rvalue di tipo unsigned int.