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

È stato utile?

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

     
      
  1. ...
  2.   
  3. L'operatore sizeof restituisce la dimensione ( in byte ) del suo operando, che può essere un'espressione o il nome tra parentesi di un tipo. [...]
  4.   
  5. Quando applicato a un operando che ha tipo char , unsigned char o firmato char , (o una versione quali & # 64257; ed di ciò) il risultato è 1 . [...]
  6.   

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top