2011-12-14 5 views
15

stavo leggendo il C++ FAQ e si diceChe cosa è int8_t se una macchina ha> 8 bit per byte?

Il linguaggio C++ garantisce un byte deve sempre avere almeno 8 bit

Allora, cosa significa questo per i tipi <cstdint>?

Domanda laterale: se desidero una matrice di byte, dovrei usare int8_t o char e perché?

+1

Tecnicamente si tratta di una domanda in C, in quanto i tipi vengono rinviati allo standard C (§7.18). – kennytm

risposta

14

C++ (e C pure) definisce intX_t (vale a dire i tipi interi di larghezza esatta) typedefs come facoltativo. Quindi, non sarà lì se non ci sono unità indirizzabili che siano esattamente a 8 bit di larghezza.

Se si desidera un array di byte, è necessario utilizzare char, come sizeof char (e signed char e unsigned char) è ben definito per essere sempre 1 byte.

+2

Attendi, se richiamo correttamente sizeof char è definito come 1, ma lo standard non specifica wheter è 1 byte o qualcos'altro – BlackBear

+0

@BlackBear: No, lo standard è molto chiaro. 'sizeof' restituisce la dimensione in byte e' sizeof (char) == 1'. –

+4

Come diavolo gestisco l'I/O su sistemi con byte di dimensioni diverse? O non dovrei nemmeno provarci? – David

2

Per aggiungere a ciò che Cat Plus Plus ha già detto (che il tipo è opzionale), è possibile verificare se è presente usando qualcosa come:

#ifdef INT8_MAX 
// type int8_t exists. 
#endif 

o più probabilmente:

#ifndef INT8_MAX 
#error Machines with bytes that don't have 8 bits aren't supported 
#endif 
+1

Un compilatore può definire 'int8_t' e fare calcoli nel software mentre la macchina non è 8 bit per byte. – Dani

+0

Non ne sono sicuro. Penso che 'int8_t' dovrebbe essere un typedef di uno dei tipi integrali di base. Ma non sono sicuro. Una tale implementazione sarebbe molto lenta su una macchina con complemento a 9 bit 1 (alcuni Unisys). –

+0

@JamesKanze, questo è esattamente il motivo per cui dovresti usare i tipi "nativi" quando possibile. – vonbrand

Problemi correlati