Gamma di valori che possono essere memorizzati in un tipo intero in C

0

C ha una famiglia di tipi interi i.e {short, int, long, long long} . È probabile che qualsiasi nuovo programmatore utilizzi int per rappresentare la variabile intera nell'applicazione e poiché il tipo int ha uno spazio a 32 bit con intervallo (-2,147,483,648 to 2,147,483,647) , ci sarà un errore non appena il valore della variabile esce dall'intervallo. Come puoi vedere il valore massimo è 2.147.483.647 che IMHO è molto piccolo (non può nemmeno contare la popolazione della Terra).

Quindi la mia domanda è: come fa il principiante a evitare questo bug? Qual è lo spazio di int sul sistema operativo a 64 bit?

    
posta vcp 11.05.2016 - 11:30
fonte

5 risposte

3

Nota: 'int' è garantito che abbia almeno 16 bit. È persino più piccolo di quanto pensassi! Se vuoi garantire che almeno 32 bit usino "long". Per valori ancora più grandi guarda cose come "int64_t" o "long long".

Come fa un principiante a evitare problemi come questo? Temo che sia lo stesso di molti altri problemi di programmazione. "pensa attentamente e prenditi cura".

Eseguire un test all'avvio del programma è una buona idea. Come sta avendo una buona serie di test unitari. Fai particolare attenzione quando ti sposti su una nuova piattaforma.

    
risposta data 11.05.2016 - 12:26
fonte
2

Limits.h memorizza i valori minimo e massimo per i tipi interi in C.

NB. C ++ ha una sua versione: <limits>

Se sei veramente interessato al numero di bit che un tipo utilizza sulla tua piattaforma, puoi fare qualcosa di simile (da qui ):

#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;
}
    
risposta data 11.05.2016 - 12:13
fonte
1

Come menzionato altrove, limits.h specificherà gli intervalli consentiti per ciascun tipo: INT_MIN , INT_MAX , UINT_MAX , ecc.

Se hai bisogno di un tipo intero di larghezza specifica , l'intestazione stdint.h fornisce definizioni di tipo come int8_t , int16_t , ecc.

    
risposta data 18.05.2016 - 17:38
fonte
0

Possiamo classificare il calcolo in diverse categorie.

Per uno: un contesto significativo per l'informatica è una forma di indicizzazione. Possiamo indicizzare in un array, ad esempio. Un'altra forma è che possiamo contare gli oggetti (ad esempio, fornire loro un ID int) che creiamo in memoria.

Per questi, i nostri linguaggi di programmazione vengono di solito implementati in modo che esauriscano la memoria prima che il tipo di intero semplice trabocchi. Ad esempio, gli array possono essere limitati a 32k in mondi a 16 bit (e si potrebbe avere solo uno di questi), 2 ^ 31 elementi in mondi a 32 bit. E non puoi creare più di 32k oggetti in mondi a 16 bit e oggetti 2 ^ 31 in mondi a 32 bit (perché gli oggetti usano quasi universalmente più di un byte ciascuno). Possiamo considerare che, in un certo senso, valori int più grandi e più grandi implicano un maggiore utilizzo della memoria e che la memoria è esaurita poco prima del semplice overflow di int.

Per un altro, tuttavia, abbiamo tipi di calcolo che non utilizzano memoria aggiuntiva in proporzione con valori numerici più grandi, ad esempio, sommatoria, dobbiamo fare molta attenzione alla selezione del tipo di dati. Altri esempi sarebbero le righe in un database, in cui il numero di riga (id riga) potrebbe superare la dimensione della memoria in quanto gran parte dei dati risiede sul disco anziché nella memoria. In questi casi dobbiamo guardare ad altri limiti per indicare la dimensione corretta da usare. Ad esempio, se il db limita a 2 ^ 63 righe (big db!), Allora dovremmo essere ok per usare un int a 64 bit, indipendentemente dal fatto che stiamo usando una macchina a 16 bit o superiore.

    
risposta data 17.05.2016 - 23:41
fonte
-2

Questa è la migliore spiegazione che ho trovato a pagina 3 che ogni principiante può capire rapidamente ed evitare bug.

    
risposta data 11.05.2016 - 12:43
fonte

Leggi altre domande sui tag