Domanda

Questo è legato alla seguente domanda,

Come dichiarare un numero intero a 32 bit in C

Diverse persone citate int è sempre a 32 bit sulla maggior parte delle piattaforme. Sono curioso di sapere se questo è vero.

Conosci delle piattaforme moderne con int di dimensioni diverse? Ignora le piattaforme di dinosauri con architetture a 8 o 16 bit.

NOTA: So già come dichiarare un numero intero a 32 bit dall'altra domanda. Questo è più simile a un sondaggio per scoprire quali piattaforme (CPU / OS / compilatore) supportano numeri interi con altre dimensioni.

È stato utile?

Soluzione

Come diverse persone hanno affermato, non vi è alcuna garanzia che un 'int' sarà di 32 bit, se si desidera utilizzare variabili di una dimensione specifica, in particolare quando si scrive codice che comporta manipolazioni di bit, è necessario utilizzare 'Standard Integer Tipi "obbligatori dalla specifica c99.

int8_t
uint8_t
int32_t
uint32_t

ecc ...

sono generalmente nella forma [u] intN_t, dove "u" specifica che si desidera una quantità non firmata e N è il numero di bit

i typedef corretti per questi dovrebbero essere disponibili in stdint.h su qualunque piattaforma tu stia compilando, usando questi ti permette di scrivere un bel codice portatile :-)

Altri suggerimenti

" è sempre a 32 bit su piattaforme most " - cosa c'è di sbagliato in quel frammento? : -)

Lo standard C non impone le dimensioni di molti dei suoi tipi integrali. richiede le dimensioni relative, ad esempio sizeof (int) > = sizeof (short) e così via. Richiede anche intervalli minimi ma consente schemi di codifica multipli (complemento a due, complemento a uno e segno / magnitudine).

Se vuoi una variabile di dimensioni specifiche, devi usarne una adatta alla piattaforma su cui stai girando, come l'uso di #ifdef , qualcosa del tipo:

#ifdef LONG_IS_32BITS
    typedef long int32;
#else
    #ifdef INT_IS_32BITS
        typedef int int32;
    #else
        #error No 32-bit data type available
    #endif
#endif

In alternativa, C99 e versioni successive consentono tipi interi di larghezza esatta intN_t e uintN_t :


  1. Il typedef name intN_t designa un tipo intero con segno con larghezza N , nessun bit di riempimento e rappresentazione del complemento a due. Pertanto, int8_t indica un tipo intero con segno con una larghezza di esattamente 8 bit.
  2. Il typedef name uintN_t indica un tipo intero senza segno con larghezza N . Pertanto, uint24_t indica un tipo intero senza segno con una larghezza di esattamente 24 bit.
  3. Questi tipi sono opzionali. Tuttavia, se un'implementazione fornisce tipi interi con larghezze di 8, 16, 32 o 64 bit, nessun bit di riempimento e (per i tipi con segno) che hanno una rappresentazione del complemento a due, deve definire il typedef nomi.

In questo momento, la maggior parte delle piattaforme desktop e server utilizzano numeri interi a 32 bit e anche molte piattaforme incorporate (pensate al palmare ARM o x86) usano int a 32 bit. Per arrivare a un int a 16 bit devi diventare davvero molto piccolo: pensa " Berkeley mote " o alcuni dei chip Atmega Atmel più piccoli. Ma sono là fuori.

No. I sistemi embedded di piccole dimensioni utilizzano numeri interi a 16 bit.

Dipende molto dal tuo compilatore. Alcuni li compilano come 64 bit su macchine a 64 bit, altri li compilano come 32 bit. I sistemi integrati sono la loro piccola sfera di cera speciale.

La cosa migliore che puoi fare per controllare:

printf("%d\n", sizeof(int));

Nota che sizeof stamperà i byte. Esegui sizeof (int) * CHAR_BIT per ottenere bit.

Codice per stampare il numero di bit per vari tipi:

#include <limits.h>
#include <stdio.h>

int main(void) {
    printf("short is %d bits\n",     CHAR_BIT * sizeof( short )   );
    printf("int is %d bits\n",       CHAR_BIT * sizeof( int  )    );
    printf("long is %d bits\n",      CHAR_BIT * sizeof( long )    );
    printf("long long is %d bits\n", CHAR_BIT * sizeof(long long) );
    return 0;
}

Bene, la maggior parte dei processori basati su ARM possono eseguire il codice Thumb, che è una modalità a 16 bit. Ciò include i notebook Android ancora solo voci e gli smartphone all'avanguardia.

Inoltre, alcuni calcolatori grafici usano processori a 8 bit, e li definirei anche abbastanza moderni.

TI vende ancora schede OMAP con DSP C55x su di esse, utilizzate principalmente per la decodifica video. Credo che il compilatore fornito per questo abbia un int a 16 bit. È quasi un dinosauro (il Nokia 770 è stato rilasciato nel 2005), anche se puoi ottenere DSP a 32 bit.

La maggior parte del codice che scrivi, puoi tranquillamente presumere che non verrà mai eseguito su un DSP. Ma forse non tutti.

Se sei interessato anche al valore massimo / minimo effettivo anziché al numero di bit, limits.h contiene praticamente tutto ciò che vuoi sapere.

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