Tipo da utilizzare per rappresentare un byte in ANSI (C89 / 90) C?
Domanda
Esiste un metodo di reclamo standard per rappresentare un byte in ANSI (C89 / 90) C? So che, molto spesso, un carattere sembra essere un byte, ma la mia comprensione è che questo non è garantito. Inoltre, vi è stdint.h nello standard C99, ma cosa veniva usato prima di C99?
Sono curioso di sapere entrambi gli 8 bit in particolare, e un "byte" (sizeof (x) == 1).
Soluzione
char
è sempre un byte , ma non è sempre un ottetto . Un byte è la più piccola unità di memoria indirizzabile (nella maggior parte delle definizioni), un ottetto è un'unità di memoria a 8 bit.
Cioè, sizeof (char)
è sempre 1 per tutte le implementazioni, ma la macro CHAR_BIT
in limits.h
definisce la dimensione di un byte per una piattaforma e non è sempre di 8 bit. Esistono piattaforme con byte a 16 e 32 bit, quindi char
occuperà più bit, ma è ancora un byte. Poiché l'intervallo richiesto per char
è almeno da -127 a 127 (o da 0 a 255), sarà almeno 8 bit su tutte le piattaforme.
ISO / IEC 9899: TC3
6.5.3.4 La dimensione dell'operatore
- ...
- L'operatore sizeof restituisce la dimensione ( in byte ) del suo operando, che può essere un'espressione o il nome tra parentesi di un tipo. [...]
- Quando applicato a un operando che ha tipo
char
,unsigned char
ofirmato char
, (o una versione quali & # 64257; ed di ciò) il risultato è 1 . [...]
Enfasi sulla mia.
Altri suggerimenti
Puoi sempre rappresentare un byte (se intendi 8 bit) in un carattere senza segno. Ha sempre una dimensione di almeno 8 bit, tutti i bit che compongono il valore, quindi un valore di 8 bit si adatterà sempre in esso.
Se vuoi esattamente 8 bit, penso anche che dovrai usare modi dipendenti dalla piattaforma. I sistemi POSIX sembrano essere richiesti per supportare int8_t. Ciò significa che sui sistemi POSIX, char (e quindi un byte) è sempre 8 bit.
In ANSI C89 / ISO C90 sizeof (char) == 1. Tuttavia, non è sempre possibile che 1 byte sia 8 bit. Se desideri contare il numero di bit in 1 byte (e non hai accesso ai limiti.h), ti suggerisco quanto segue:
unsigned int bitnum(void) {
unsigned char c = ~0u; /* Thank you Jonathan. */
unsigned int v;
for(v = 0u; c; ++v)
c &= c - 1u;
return(v);
}
Qui usiamo il metodo di Kernighan per contare il numero di bit impostati in c . Per comprendere meglio il codice sopra (o vedere altri simili), ti rimando a " Bit Twiddling Hacks " ;.
Prima di C99? Codice dipendente dalla piattaforma.
Ma perché te ne importa? Usa solo stdint.h.
In ogni implementazione di C che ho usato (dai vecchi UNIX ai compilatori integrati scritti dagli ingegneri hardware ai compilatori di grandi fornitori) char
è sempre stato a 8 bit.
Puoi trovare macro e typedef abbastanza affidabili in boost.
Ho notato che alcuni hanno ridefinito il byte parola per significare qualcosa di diverso da 8 bit. Un byte è 8 bit, tuttavia in alcune implementazioni c char è 16 bit (2 byte) o 8 bit (1 byte). Le persone che chiamano un byte "la più piccola unità di memoria indirizzabile" o alcuni di questi rifiuti hanno perso la comprensione del significato di byte (8 bit). Il motivo per cui alcune implementazioni di C hanno caratteri a 16 bit (2 byte) e alcuni hanno caratteri a 8 bit (1 byte) e non esiste un tipo standard chiamato 'byte', è dovuto alla pigrizia.
Quindi, dovremmo usare int_8