2015-05-11 16 views

risposta

18

char è 1 byte in C perché è specificato così negli standard.

La logica più probabile è. la rappresentazione (binaria) di un char (nel set di caratteri standard) può essere inserita nel byte 1. Al momento dello sviluppo principale di C, gli standard più comunemente disponibili erano ASCII e EBCDIC che richiedevano rispettivamente la codifica a 7 e 8 bit. Quindi, 1 byte era sufficienti per rappresentare l'intero set di caratteri.

OTOH, durante il tempo Java è entrato in figura, i concetti di set esteso charcater e unicode erano presenti. Quindi, per essere a prova di futuro e supportare l'estensibilità, char è stato fornito 2 bytes, che è in grado di gestire esteso valori di set di caratteri.

+0

Proprio così :-). – Eregrith

+0

Ovviamente, anche lì si sono rovinati ... un 'char' a 16 bit non è in grado di rappresentare ogni carattere Unicode. – duskwuff

+2

@duskwuff: Non solo, ma anche se l'intenzione era quella di evitare di essere incentrati sull'inglese, in molti casi d'uso UTF-16 finirà per essere più ingombrante di UTF-8 anche per le lingue che usano molti caratteri che sarebbero rappresentati più in modo compatto in UTF-16, poiché gran parte del testo che il processo di macchine è progettato per essere leggibile dalla macchina anziché leggibile da un utente, e il testo leggibile da una macchina è solitamente ASCII. – supercat

5

Perché un char può contenere più di 1 byte? Un carattere normalmente rappresenta un carattere ASCII. Basta dare un'occhiata ad una tabella ASCII, ci sono solo 256 caratteri nel codice ASCII (esteso). Quindi è necessario rappresentare solo i numeri da 0 a 255, che scende a 8 bit = 1 byte.

Dai un'occhiata ad una tabella ASCII, ad es. qui: http://www.asciitable.com/

Questo è per C. Quando è stato progettato Java, prevedevano che in futuro sarebbe bastato che qualsiasi carattere (anche Unicode) fosse tenuto in 16 bit = 2 byte.

5

È perché il linguaggio C ha 37 anni e non è stato necessario aggiungere più byte per 1 carattere, poiché sono stati utilizzati solo 128 caratteri ASCII (http://en.wikipedia.org/wiki/ASCII).

0

Non è necessario più di un byte per rappresentare l'intera tabella ascii (128 caratteri).

Ma ci sono altri tipi C che hanno più spazio per contenere dati, come int tipo (4 byte) o lungo doppio tipo (12 byte).

Tutti questi contengono valori numerici (anche caratteri! Anche se sono rappresentati come "lettere", sono "numeri", è possibile confrontarlo, aggiungerlo ...).

Queste sono solo diverse dimensioni standard, come cm e m per lunghezza,.

2

Quando C fu sviluppato (il primo libro su di esso fu pubblicato dai suoi sviluppatori nel 1972), i due standard di codifica dei caratteri primari erano ASCII ed EBCDIC, che erano rispettivamente codifiche a 7 e 8 bit per i caratteri. E la memoria e lo spazio su disco erano entrambi maggiori preoccupazioni al momento; C è stato reso popolare su macchine con uno spazio di indirizzamento a 16 bit e l'utilizzo di più di un byte per le stringhe sarebbe stato considerato inutile.

Quando Java è arrivato (metà anni '90), alcuni con la visione sono stati in grado di percepire che un linguaggio potrebbe utilizzare uno stnadard internazionale per la codifica dei caratteri, e quindi Unicode è stato scelto per la sua definizione. La memoria e lo spazio su disco erano meno problemi di allora.

0

Lo standard linguaggio C definisce una macchina virtuale in cui tutti gli oggetti occupano un numero intero di astratte unità di memoria costituiti di un numero fisso di bit (indicato dal CHAR_BIT macro in limits.h). Ogni unità di memoria deve essere indirizzabile in modo univoco. Un'unità di memoria è definita come la quantità di memoria occupata da un singolo carattere dal set di caratteri di base . Così, per definizione , la dimensione del tipo char è 1.

Infine, queste unità di archiviazione astratte devono essere mappato su hardware fisico. Le architetture più comuni utilizzano byte a 8 bit indirizzabili individualmente, pertanto gli oggetti char di solito si mappano su un singolo byte a 8 bit.

Normalmente.

Storicamente, le dimensioni dei byte nativi sono state ovunque da 6 a 9 bit di larghezza. In C, il tipo char deve essere almeno largo 8 bit per rappresentare tutti i caratteri nel set di caratteri di base, quindi per supportare una macchina con byte a 6 bit, un compilatore potrebbe dover mappare un oggetto char su due byte macchina nativi, con CHAR_BIT in 12.sizeof (char) è ancora 1, quindi i tipi con dimensione N verranno associati ai byte nativi 2 * N.


1. Il set di caratteri base consiste di tutte le 26 lettere inglesi sia maiuscole e minuscole, 10 cifre, punteggiatura e altri caratteri grafici e controllo quali nuove righe, schede, alimentazioni di forma, ecc , che si adattano comodamente a 8 bit.

+0

Il set di caratteri di base su un sistema ASCII potrebbe adattarsi facilmente a sette bit; Sospetto che 'char' debba essere almeno otto perché quando C fu inventato gli ottetti stavano iniziando ad emergere come standard comune, nessuno usò unità di memorizzazione a sette bit e si piegò all'indietro per supportare una macchina vagamente immaginabile con sette bit le unità di memoria indirizzabili non sembravano utili. – supercat

+0

Sei corretto; il set di caratteri di base si inserisce in 7 bit (quindi perché si adatta comodamente in 8). L'8 bit è stato originariamente utilizzato come bit di parità per il controllo degli errori (sia su linee di comunicazione che in memoria). Tuttavia, lo standard C impone che i tipi 'char' occupino * almeno * 8 bit, indipendentemente dal numero di bit necessari per rappresentare quei caratteri di base. –

+0

Mi chiedo se siano stati usati 8 bit anziché 7 per consentire il controllo di parità, o se sono stati utilizzati 8 perché era più facile avere un numero pari, e il controllo di parità è stato aggiunto come "abbiamo questo bit e possiamo anche provare a fare qualcosa con esso "? Un ottetto può memorizzare convenientemente due valori base-16 o base-10, o quattro valori base-4; un sestetto potrebbe comodamente contenere due valori base-8 o tre valori base-4. Un settetto potrebbe in qualche modo contenere due valori di base 10 o valori di base 11, ma non con la stessa convenienza di un ottetto. – supercat

Problemi correlati