2012-01-29 10 views
12

Ho letto che si può usare "char" per interi piccoli. Tuttavia, quando provo,Utilizzo di char per il piccolo intero (C++)

unsigned char A = 4; 
std::cout << A << std::endl; 

dà un carattere, non 4.

+1

dove l'hai letto? comunque, dovrebbe essere la chat senza segno A = '4'; e verrà memorizzato come carattere non intero – krammer

+6

Char è implicitamente utilizzato come caratteri, per impedire a questo cast di int: 'std :: cout << (int) A << std :: endl;' – Nobody

+3

@krammer: it dipende da cosa vuole e intendi char non chattare, giusto? – Burkhard

risposta

17

Cosa si verificano sono gli effetti di overloading degli operatori. L'operatore <<assume che molto probabilmente si desidera stampare un carattere quando si passa una variabile di tipo char, pertanto si comporta in modo diverso da come ci si aspetterebbe per le variabili integrali.

Come suggerito da Vivek Goel è possibile forzare il compilatore per selezionare il sovraccarico si vuole realmente:

unsigned char A = 4; 
std::cout << static_cast<unsigned int>(A) << std::endl; 

Addendum: A meno che non si sta lavorando su un ambiente con risorse fortemente vincolate (. Esp piccola memoria) , stai ottimizzando dalla parte sbagliata. Le operazioni su unsigned int sono in genere più veloci rispetto a unsigned char, poiché il processore non può recuperare singoli byte ma deve ottenere almeno un multiplo di 4 e mascherare gli altri 3 byte.

4

Dovrebbe essere

unsigned char A = 4; 
    std::cout << (int)A << std::endl; 
4

Un char IS un piccolo intero (con intervallo da -127 a +127), ed è sottoposto alla stessa aritmetica intero come interi sono.

Il problema, qui, è il concetto di confusione tra la rappresentazione interna (numero binario che rappresenta l'intervallo da -127 a +127) con quella esterna, che fa convenzionalmente le funzioni di input e output per rappresentarlo come "il glifo il cui codice ASCII è il numero riportato da esso ", mentre per il numero intero, la rappresentazione esterna è" la sequenza di caratteri che legge come il numero intero rappresentato in forma decimale "

Il modo più semplice per stamparlo come un numero, è convertirlo in int appena prima di darlo alla funzione di output (come cout << int(ch) o qualsiasi altro modulo di conversione equivalente)

6

C'è un sovraccarico di operator<< per std::ostream e (signed/unsigned) char che esegue l'output di caratteri; al fine di emettere il valore intero del carattere, è necessario eseguire un cast:

std::cout << (int)A << std::endl; 

Tuttavia, questo è ciò che è chiamato un “vecchio stile” (più specificamente C-style) cast. C++ ha colata operatori che sono più esplicito, più facile da cercare, e in genere preferito:

std::cout << static_cast<int>(A) << std::endl; 

ma questo è ingombrante per tipo; l'alternativa idiomatica è quello di utilizzare l'operatore +, che promuove il suo argomento (unsigned) int:

std::cout << +A << std::endl; 

Questo è ciò che si dovrebbe usare.

+1

+1 per la promozione '+ A' – bitmask

1

Per singoli oggetti, è probabile che l'aumento delle dimensioni del codice riduca la diminuzione delle dimensioni di archiviazione di qualsiasi (la memoria che segue l'oggetto potrebbe essere necessaria per il riempimento dell'allineamento). Utilizzare int a meno che non si abbia bisogno di una grande serie di piccoli numeri interi.

Problemi correlati