Se char
è firmato, quindi eseguire l'aritmetica su un valore di byte con il bit alto impostato comporterà l'estensione del segno quando si promuove a int
; così, ad esempio:
char c = '\xf0';
int res = (c << 24) | (c << 16) | (c << 8) | c;
darà 0xfffffff0
anziché 0xf0f0f0f0
. Questo può essere evitato mascherando con 0xff
.
char
potrebbe essere preferibile se si interfaccia con librerie che lo utilizzano invece di unsigned char
.
Si noti che un cast da char *
a/da unsigned char *
è sempre sicuro (3.9p2). Una ragione filosofica favorire unsigned char
è che 3.9p4 nello standard favorisce, almeno per rappresentare array di byte che potrebbe tenere rappresentazioni della memoria di oggetti:
La rappresentazione oggetto di un oggetto di tipo T
è la sequenza di N
unsigned char
oggetti rilevati dall'oggetto del tipo T
, dove N
equivale a sizeof(T)
.
@nightcracker Forse, potresti indicare il duplicato? – Cartesius00
Dupe con https://stackoverflow.com/questions/653336/ – kebs