2012-01-10 10 views
5

In C su un sistema a 32 bit, quale tipo di dati memorizzerà (e può quindi stampare) il numero intero più grande? È long long o unsigned long? C'è un unsigned long long? E qual è il più preciso e politicamente corretto?Qual è il tipo di dati più grande per la memorizzazione (e la stampa) di un intero?

+4

Se sei solo interessati con la possibilità di visualizzare grandi numeri, voterei per char *. :) –

+2

Potresti aver fatto la domanda sbagliata. * Quanto in alto hai bisogno di andare? * – Jon

+1

Sì, C99 supporta un tipo primitivo 'unsigned long long', ma C90 no. E dal momento che molti compilatori C in circolazione sono ancora C90, la risposta potrebbe essere no. Quale stai usando/interessato? –

risposta

10

La tua domanda è un po 'poco chiara, ma intmax_t è il più grande tipo con valore intero con segno (e uintmax_t è il più grande tipo di intero senza segno). Questi sono typedef definiti in <stdint.h>, ma se si stanno stampando, è necessario invece <inttypes.h> e le macro PRInMAX per vari valori di n.

+5

E 'uintmax_t' (se l'implementazione li supporta, sono stati aggiunti in C99). –

+0

dont '% jd' e'% ju' funzionano (e hanno un aspetto migliore) per stampare 'intmax_t' e' uintmax_t' rispettosamente? Fonte: - [l'ultima bozza C11 liberamente disponibile] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf), vedere la sezione 7.21.6.1 su 'fprintf' –

1

In ISO C99 long long è almeno a 64 bit, che è il più grande standard di tipo di dati intero. Viene anche come unsigned long long. Apparentemente il tuo compilatore potrebbe fornire tipi più grandi che sono stati definiti da intmax_t e uintmax_t.

Tuttavia, in base ai commenti, è possibile che si stia cercando una libreria bigint come GMP. Permette di arbitrari interi lunghi (e in virgola mobile) di lunghezza limitata solo dalle risorse di sistema.

+4

Sì (si noti che 'long long' e' unsigned long long 'sono tipi distinti), ma le implementazioni possono avere * tipi interi estesi * più larghi di 'long long'. I typedefs 'intmax_t' e' uintmax_t', definiti in '' e '', corrispondono rispettivamente ai più grandi tipi firmati e non firmati, indipendentemente dal fatto che siano tipi estesi o meno. –

+0

@KeithThompson Grazie, l'ho incorporato. – ChrisWue

0

Il tipo di dati con la stringa stampata più lunga è un tipo di dati firmato, a meno che non si disponga di un tipo intero con un valore non firmato massimo di una cifra superiore al valore massimo firmato.

Ad esempio, un numero intero a 4 bit senza segno sarebbe composto al massimo da due caratteri senza segno o da un carattere più il segno negativo al momento della firma.

Pertanto, è necessario selezionare un tipo di dati firmato per rappresentare la stringa stampata più grande. Quale dovrebbe essere long long.

+0

il la stringa stampata più lunga per 'int64_t' e' uint64_t' sono '-9223372036854775808' e' 18446744073709551615' rispettivamente, che hanno la stessa lunghezza –

2

Senza giri di parole vorrei dire che a volte non in pratica di codifica effettiva in determinate competizioni potremmo aver bisogno di tipi di dati molto grandi. Penso che possiamo farlo. Perché non prendere l'intera sequenza, sotto forma di stringa e quindi utilizzare la funzione atoi per ottenere il valore intero è penso politcally corretta :: :)

#include<stdio.h> 
#include<stdlib.h> 

int main() 
{ 
    int i; 
    char bigString [256]; 

    printf ("Enter a number: "); 
    fgets (bigString, 256, stdin); 

    i = atoi (bigString); 
    printf ("The value entered is %d.",i); 

    return 0; 
} 
+5

Hai ancora bisogno di memorizzare il valore convertito in un numero intero che causa ancora un overflow. – Sinstein

Problemi correlati