Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Attributo
Forum - C/C++ - Attributo "unsigned": perché usarlo?

Avatar
giulioscatto (Normal User)
Rookie


Messaggi: 37
Iscritto: 03/08/2009

Segnala al moderatore
Postato alle 23:35
Domenica, 17/07/2011
Salve a tutti.
Leggendo un testo mi sono imbattuto in questa dichiarazione:
Codice sorgente - presumibilmente C/C++

  1. unsigned char* ptr;



Perché è stata fatta la scelta di dichiarare questo puntatore a char come senza segno? Spero di non cadere troppo in basso con questa domanda forse sciocca.

Grazie mille.
Giulio

PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Up
4
Down
V
Segnala al moderatore
Postato alle 2:21
Lunedì, 18/07/2011
A volte un programmatore può utilizzare char come numero (scelta discutibile, se devo utilizzare un char come numero preferisco definire un nuovo tipo "typedef char int8" così da rendere esplicito il fatto che sto utilizzando un char come un intero a 8 bits).

Dichiarandolo unsigned hai a disposizione i numeri da 0 a 255. Dichiarandolo signed da -128 a 127. Dichiarandolo semplicemente come "char" non si sa se il compilatore lo userà come signed o unsigned, quindi il range "sicuro" a tua disposizione è da 0 a 127.

Ultima modifica effettuata da pierotofy il 18/07/2011 alle 18:12
perché discutibile? Vero che porta confusione, però per risparmiare spazio è l'ideale no? Che senso ha usare un intero quando mi serve un numero da 1 a 50? - lorenzo - 18/07/11 09:02
L'unsigned char non è altro che un valore ad 8 bit binario puro, utilissimo in tante situazioni. E' largamente usato. - nessuno - 18/07/11 09:36
veramente il default è "signed", quindi se non specifichi nulla ottieni un intero con segno. Gli unsigned si usano in modo pesante nei calcoli grafici, ad esempio interpretando array di 4 unsigned char come i 4 canali di una immagine RGBA32 - TheKaneB - 18/07/11 10:06
Quoto @lorenzo e @nessuno, i char sono molto utili se sei sicuro di non sforare dal range...Per non fare confusione l'ideale sarebbe fare un typedef unsigned char byte/int8 etc... - comina8 - 18/07/11 12:28
@TheKaneB: in verità lo standard non definisce se un char debba essere "signed" o "unsigned"... poi se la maggior parte dei compilatori preferisce uno o l'altro è un'altro discorso. - pierotofy - 18/07/11 17:57
@lorenzo: questi sono discorsi che si facevano negli anni 70... praticamente tutti i processori hanno registri almeno da 32 bit, non c'è nessun guadagno effettivo in velocità ad utilizzare un char al posto di un int. - pierotofy - 18/07/11 18:00
In realtà il char è un "integer type". E tutti gli interi, per default, sono signed. - nessuno - 18/07/11 18:01
@nessuno: ovviamente è utile, ma definirei comunque un nuovo tipo typedef char int8. Ho scritto discutibile perchè un programmatore non C potrebbe confondersi vedendo la parola "char". Avrei dovuto specificare il mio ragionamento. - pierotofy - 18/07/11 18:03
effettivamente hai ragione. Non è indicato dallo standard, ma è implementation dependent. - TheKaneB - 18/07/11 18:09
Infatti ... si usa il default per i tipi interi. @piero ... sono d'accordo, il fatto è che io ho sempre "visto" il char come se fosse "byte" (deformazione dall'assembly ,,,) - nessuno - 18/07/11 18:13
Che senso ha editare la risposta? -.-" - comina8 - 18/07/11 22:07


Il mio blog: https://piero.dev
PM
Avatar
arack95 (Member)
Pro


Messaggi: 144
Iscritto: 15/11/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 23:56
Domenica, 17/07/2011
Umh, è un puntatore a -char senza segno-, non un -puntatore senza segno- ad un char :om:

Si beh, in effetti aveva poco senso quello che ho detto. Comunque potresti spiegarmi perchè dovrebbe essere senza segno? Non capisco che differenza ci sia fra il mettere e il non mettere l'attributo unsigned. - giulioscatto - 18/07/11 00:03
PM
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 1:00
Lunedì, 18/07/2011
Caratteri ASCII con segno negativo non esistono, quindi se devi usare il puntatore solo come stringa in effetti dovresti avere la possibilità di includere tutti i 255 caratteri...

E' solo una interpretazione ... puoi usare il carattere ASCII 255 anche se il valore per il compilatore per quel dato momento è -1 - nessuno - 18/07/11 11:08
Vero anche questo...dipende un po' da come ti gira alla fine... - comina8 - 18/07/11 12:31
PM