2011-01-14 44 views
9

Qual è il punto dei valori ASCII negativi?Valore ASCII negativo

int a = '«'; //a = -85 but as in ASCII table '<<' should be 174 
+13

codici ASCII solo andare da 0 - 127. –

+8

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. –

+1

"Il cosiddetto ASCII esteso" non esiste. Tuttavia, le codifiche a byte singolo lo fanno. – n0rd

risposta

3

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.

+1

intendi "caratteri non firmati"? – user963241

10

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.

+2

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.) –

+0

@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

+0

@stefaanv: Va bene; non è quello che stavo contestando. –

9

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. :)

+1

I loro indici sono tutti non negativi ;-). –

+0

@Charles: Pfft. : P –

+1

Non esiste "ASCII esteso". –

2

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).

+3

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). –

+0

(Ciò è contrario a 'int', che è esplicitamente, sempre uguale a' signed int'.) –

+0

Lo chiarirò.Intendevo 'default nella maggior parte dei compilatori', non nelle specifiche. – jv42

1

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:

  • isalpha ((carattere non firmato) my_char);

@ n0rd: tabella codici koi8 utilizza ASCII da 128 a 255 e altre codepages nazionali: http://www.asciitable.com/

0

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)

Problemi correlati