Qual è il punto dei valori ASCII negativi?Valore ASCII negativo
int a = '«'; //a = -85 but as in ASCII table '<<' should be 174
Qual è il punto dei valori ASCII negativi?Valore ASCII negativo
int a = '«'; //a = -85 but as in ASCII table '<<' should be 174
Non esiste una cosa del genere. ASCII è una tabella di caratteri, ogni carattere ha un indice o una posizione nella tabella. Non ci sono indici "negativi".
Alcuni compilatori, tuttavia, considerano char
un tipo di dati integrale firmato, che è probabilmente il motivo della confusione qui.
Se si stampa come unsigned int
, si otterranno gli stessi bit interpretati come un valore (positivo) senza segno.
intendi "caratteri non firmati"? – user963241
Si tratta di un manufatto di char
tipo del compilatore di essere un tipo firmato intero, e int
essendo un tipo intero con segno più ampia, e quindi la costante carattere è considerato un numero negativo ed è segno-esteso al tipo intero più ampio .
Non ha molto senso, succede e basta. Lo standard C consente alle implementazioni del compilatore di scegliere se considerare char
da firmare o non firmati. Alcuni compilatori hanno persino opzioni di tempo di compilazione per modificare il valore predefinito. Se si desidera accertarsi della firma del tipo char
, scrivere esplicitamente signed char
o unsigned char
, rispettivamente.
Utilizzare un unsigned char
per essere esteso a un int
per evitare il valore negativo int
, o aprire un nuovo vaso di Pandora e godere wchar
.
No, è perché il personaggio non si adatta al letterale. Il problema si verifica * prima * il 'int' arriva anche nell'immagine. Il letterale finisce con il valore -85 a causa di un overflow, e quindi questo valore -85 viene assegnato all'int. (È possibile che questo è ciò che intendevi e ti ho frainteso.) –
@Tomalak: è solo una semantica se 174 non firmati siano appena stati firmati -85 o se ci sia stato un overflow. Per me traboccare ha più a che fare con i calcoli. Alla fine, il risultato è lo stesso. – stefaanv
@stefaanv: Va bene; non è quello che stavo contestando. –
Non ci sono valori ASCII negativi. ASCII include definizioni per 128 caratteri. I loro indici sono tutti positivi (o zero!).
Stai vedendo questo valore negativo perché il carattere è da un esteso ASCII impostato ed è troppo grande per adattarsi al valore letterale char. Il valore quindi trabocca nel bit del tuo char
(firmato sul tuo sistema, apparentemente) che definisce la negatività.
La soluzione è scrivere il valore direttamente:
unsigned char a = 0xAE; // «
L'ho scritto in notazione esadecimale per congressi e perché penso che sembra più bella di 174
. :)
I loro indici sono tutti non negativi ;-). –
@Charles: Pfft. : P –
Non esiste "ASCII esteso". –
Intervalli ASCII 0..127, ANSI (chiamato anche 'ASCII esteso') intervalli 0..255.
L'intervallo ANSI non si adatta a un carattere firmato (il tipo predefinito per i caratteri nella maggior parte dei compilatori).
La maggior parte dei compilatori ha un'opzione come 'char' Type is Unsigned (GCC).
Il carattere di firma non è "il tipo predefinito per i caratteri". La signness di un tipo 'char' non qualificato è completamente specificato dall'implementazione. I caratteri letterali hanno tipo 'char'. Il suo sistema usa semplicemente un'implementazione firmata per 'char' (come credo la maggior parte dei sistemi popolari). –
(Ciò è contrario a 'int', che è esplicitamente, sempre uguale a' signed int'.) –
Lo chiarirò.Intendevo 'default nella maggior parte dei compilatori', non nelle specifiche. – jv42
Ho avuto questo artefatto. Quando usi char come simboli non hai problemi. Ma quando lo si usa come intero (con isalpha(), ecc.) E il codice ASCII è maggiore di 127, allora 'char' interpreta come 'signed char' e isalpha() restituisce un'eccezione.Quando ho bisogno di usare il carattere "char" come unsteger, scrivo "char" a unsigned:
@ n0rd: tabella codici koi8 utilizza ASCII da 128 a 255 e altre codepages nazionali: http://www.asciitable.com/
In una rappresentazione di carattere, si hanno 8 bit (1 byte) assegnati. Di questo, il primo bit è utilizzato per rappresentare il segno. Nel caso di carattere senza segno, utilizza tutti gli 8 bit per rappresentare un numero che consente da 0 a 255 dove 128-255 sono denominati ASCII estesi. causa della rappresentazione nella memoria, come ho descritto, abbiamo -1 aventi lo stesso valore di 255, char(-2)==char(254)
codici ASCII solo andare da 0 - 127. –
noti che ASCII è valido solo per valori nell'intervallo 0 ..127. Il cosiddetto * ASCII esteso * include i valori da 128..255 e si vede solo un valore espresso qui come un carattere firmato. –
"Il cosiddetto ASCII esteso" non esiste. Tuttavia, le codifiche a byte singolo lo fanno. – n0rd