2009-12-21 23 views
5
  1. caratteri in "C" vengono utilizzati per rappresentare i caratteri.
  2. I numeri che rappresentano i caratteri in tutte le tabelle codici sono sempre positivi.

Qual è l'uso di avere caratteri firmati ?? I valori negativi contenuti nei caratteri vengono utilizzati solo come valori interi in un tipo di dati integrale più piccolo di int e short ?? Non hanno altra interpretazione (come i valori positivi nei caratteri che rappresentano i caratteri)significato dei valori negativi di tipo carattere in C

risposta

11

i caratteri in "C" sono utilizzati per rappresentare i caratteri.

Non sempre, i caratteri vengono utilizzati per rappresentare i byte, sono l'unico tipo in c con una dimensione nota.

+12

Se si intende che sono l'unico tipo in cui sizeof (tipo) è garantito per essere 1, sì. Non sono garantiti per essere 8 bit. –

+2

L'unica cosa che C dice della dimensione di un char è che è 1. Non dice quali siano le unità di 1. –

+1

PDP-10, ad esempio, utilizza byte da 9 bit. –

2

Da Jack Klein's Home Page:

signed char può contenere tutti i valori nella gamma di SCHAR_MIN a SCHAR_MAX, definito in limits.h. SCHAR_MIN deve essere -127 o meno (più negativo) e SCHAR_MAX deve essere 127 o superiore. Si noti che molti compilatori per processori che utilizzano una rappresentazione complemento a 2 supportano SCHAR_MIN di -128, ma questo non è richiesto dagli standard.

Da quello che posso dire, non esiste un "significato" ufficiale di signed char. Tuttavia, una cosa di cui essere a conoscenza è che tutti i normali caratteri ASCII rientrano nell'intervallo 0-127. Pertanto, è possibile utilizzare il tipo signed char per limitare i valori legali all'intervallo 0-127 e definire un valore inferiore a 0 come errore. Ad esempio, se avessi una funzione che cerca un testo ASCII e restituisce il carattere che si verifica più frequentemente, forse potrei definire un valore di ritorno negativo per indicare che ci sono due o più caratteri legati più frequentemente. Questo non è necessariamente un buon modo di fare le cose, è solo un esempio fuori di testa.

+1

Molto semplice, ci sono 3 tipi di 'char':' unsigned char', 'signed char' e' char'. I primi due sono espliciti e usati per manipolare il più piccolo tipo di dati numerici. Tuttavia, 'char', l'implementazione è definita se è firmata o non firmata. In sintesi, quando il segno è significativo, aggiungi il qualificatore. –

0

In caratteri C e C++ possono essere firmati o non firmati. Una variabile char può essere utilizzata per contenere un valore intero piccolo. Ciò è utile per diversi motivi:

  • Su piccole macchine, ad es. un micro 8 bit. Potrebbe consentire un accesso e una manipolazione più efficienti.
  • Se si desidera avere una vasta gamma di valori piccoli, ad esempio 100 K, è possibile salvare un sacco di memoria utilizzando una serie di caratteri anziché. per esempio. int.

In C, un carattere letterale è una costante intera. '0' è uguale a 48.

+0

Nit: ''0'' può essere o non essere 48. È un numero intero piccolo, in grado di adattarsi a un' char', ma non è necessario che sia 48. –

+0

Mi hai preso. Ho dimenticato di EBCDIC. ;-) –

+1

Richard, c'è sempre il DeathStation 9000 [http://dialspace.dial.pipex.com/prod/dialspace/town/green/gfd34/art/] :) – pmg

4

I numeri che rappresentano i caratteri in tutte le tabelle codici sono sempre positivi.

Erm ... errato!?

Dalla standard C99, sottolineatura mia:

Se un membro del personaggio esecuzione base impostato è memorizzato in un oggetto char, il suo valore è garantito per essere positivo.

Non è garantito che tutti i caratteri validi di tutte le code page siano positivi. Se char è firmato o non firmato è stata definita l'implementazione!

4

solo caratteri del set di caratteri esecuzione base sono garantiti per essere non negativo (C99, 6.5.2 §3):

Un oggetto dichiarato di tipo char è abbastanza grande per memorizzare qualsiasi membro del set di caratteri di esecuzione di base. Se un membro del set di caratteri di esecuzione di base è memorizzato in un oggetto char , il suo valore è garantito da non negativo. Se qualsiasi altro carattere è memorizzato in un oggetto char, il valore risultante è definito dall'implementazione ma deve rientrare nell'intervallo di valori che può essere rappresentato in quel tipo.

Bisogna discernere tra il 'pianura' char tipo e le tipologie signed char e unsigned char così: signed char e unsigned char sono tipi interi ordinari per i quali vale quanto segue (C99, 6.5.2 § 5):

Un oggetto dichiarato come tipo signed char occupa la stessa quantità di memoria di un oggetto char "plain" .

+0

Inoltre, se 'char' è firmato sul tuo piattaforma e si legge un carattere con un punto di codice maggiore di 'CHAR_MAX' (ad esempio un carattere come æ in ISO-8859-1, che ha il codice' 0xE6'), è molto probabile che si ottenga un valore di char negativo. – caf

0

In C, una char (compresi signed char e unsigned char) viene usato per memorizzare un byte, che lo standard C definisce un piccolo intero almeno 8 bit dimensioni.

La presenza di byte firmati e non firmati è utile quanto avere numeri interi più grandi. Se stai memorizzando un numero molto grande di numeri piccoli (0..255 per unsigned, -127..127 per signed [1]) in un array, potresti preferire utilizzare i byte per loro piuttosto che, ad esempio, brevi , per risparmiare spazio.

Storicamente, un byte e un carattere di testo erano praticamente la stessa cosa. Poi qualcuno si è reso conto che ci sono più lingue che l'inglese. In questi giorni, il testo è molto più complicato, ma è troppo tardi per cambiare il nome del tipo char in C.

[1] -128..127 per macchine con rappresentazione a complemento a due per numeri negativi, ma il C lo standard non lo garantisce.

+0

In realtà, il termine "byte" non viene definito da nessuna parte. In C/C++ i caratteri sono sequenze di bit e così ogni oggetto. Ma 'int' è" la dimensione naturale suggerita dall'architettura dell'ambiente di esecuzione "(C++ 11 §3.9.1/2). Quindi lo standard può definire il termine parola macchina, ma non il byte macchina. 'char' non è nemmeno la più piccola unità di memoria indirizzabile. Ad esempio, per definire un char a 4 bit usa 'struct char4 {unsigned int c: 4; } ' –

2

È sufficiente prestare attenzione all'utilizzo di caratteri come indici di array.

char buf[10000]; 
fgets(buf, sizeof buf, stdin); 
unsigned charcount[UCHAR_MAX] = {0}; 
char *p = buf; 
while (*p) { 
    charcount[*p]++; /* if (*p < 0) BOOM! */ 
    // charcount[(unsigned char)*p]++; 
    p++; 
} 
1

Vale la pena notare che il char è un tipo distinto dal char con segno e senza segno.

Problemi correlati