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.
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.
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.
Dovrebbe essere
unsigned char A = 4;
std::cout << (int)A << std::endl;
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)
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 per la promozione '+ A' – bitmask
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.
dove l'hai letto? comunque, dovrebbe essere la chat senza segno A = '4'; e verrà memorizzato come carattere non intero – krammer
Char è implicitamente utilizzato come caratteri, per impedire a questo cast di int: 'std :: cout << (int) A << std :: endl;' – Nobody
@krammer: it dipende da cosa vuole e intendi char non chattare, giusto? – Burkhard