2009-11-30 17 views

risposta

95

I minimi gamme si può contare su sono:

  • short int e int: -32.767 a 32.767
  • unsigned short int e unsigned int: da 0 a 65.535
  • long int: -2.147.483.647 a 2.147.483.647
  • unsigned long int: da 0 a 4.294.967.295

Questo significa che non, long intnon può essere fatto valere per memorizzare qualsiasi numero di 10 cifre. Tuttavia, un tipo più grande long long int è stato introdotto in C in C99 e C++ in C++ 11 (questo tipo è spesso supportato come estensione da compilatori creati per standard precedenti che non lo includevano). L'intervallo minimo per questo tipo, se il compilatore lo supporta, è:

  • long long int: -9.223.372.036.854.775.807 per 9.223.372.036.854.775.807
  • unsigned long long int: da 0 a 18.446.744.073.709.551.615

Così quel tipo sarà abbastanza grande (di nuovo , se è disponibile).


Una nota per coloro che credono di aver commesso un errore con questi limiti inferiori - Non l'ho fatto. I requisiti C per gli intervalli sono scritti in modo da consentire le rappresentazioni integer del complemento o del numero di caratteri, laddove il valore rappresentativo più basso e il valore rappresentabile più alto differiscono solo nel segno. È anche possibile avere una rappresentazione complemento a due in cui il valore con il segno bit 1 e tutti i bit valore 0 è una rappresentazione trap anziché un valore legale. In altre parole, è non necessario per rappresentare il valore -32.768.

+0

Anche il titolo aveva originariamente detto "C/C++". – caf

+0

perché intervallo lungo positivo int lungo == intervallo negativo –

+0

@mohamedabdallah: vedere l'ultimo paragrafo della risposta: gli intervalli standard C sono in questo modo per consentire le rappresentazioni del complemento o della grandezza del segno. – caf

-1

È necessario esaminare le specializzazioni del modello numeric_limits <> per un determinato tipo. È nell'intestazione.

29

La dimensione dei tipi numerici non è definita nello standard C++, sebbene le dimensioni minime siano. Il modo per dire che dimensioni sono sulla vostra piattaforma è quello di utilizzare numeric limits

Ad esempio, il valore massimo per un int può essere trovato:

std::numeric_limits<int>::max(); 

computer non funzionano in base 10, che significa che il valore massimo sarà sotto forma di 2 n -1 a causa di come i numeri di rappresentano in memoria. Prendiamo ad esempio otto bit (1 byte)

0100 1000 

Il diritto più bit (numero) quando impostato su 1 rappresenta 2 , il bit successivo 2 , quindi 2 e così via fino otteniamo il bit più a sinistra che se il numero non è firmato rappresenta 2 .

Così il numero rappresenta 2 + 2 = 64 + 8 = 72, perché il quarto bit da destra e 7 bit destra sinistra sono impostati.

Se poniamo tutti i valori di 1:

11111111 

Il numero è ora (supponendo senza segno)
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 = 2 - 1
E come possiamo vedere, questo è il più grande valore possibile che può essere rappresentato con 8 bit.

Sulla mia macchina e int e un lungo sono gli stessi, ognuno in grado di tenere tra -2 -2 - 1. Nella mia esperienza la dimensione più comune sulla moderna macchina desktop a 32 bit.

+0

Le dimensioni minime per il tipo intero sono imposte dagli standard pertinenti (anche se le dimensioni esatte non lo sono). – caf

0

Può unsigned long int contenere un numero di dieci cifre (1.000.000.000 - 9.999.999.999) su un computer a 32 bit.

No

7

Altre persone pubblicheranno link a data_sizes e precisioni, ecc.
Ho intenzione di dirti come scoprirlo da solo.
Scrivi una piccola app che eseguirà quanto segue.

unsigned int ui; 
std::cout << sizeof(ui)); 

questo sarà (a seconda del compilatore e archicture) stampare 2, 4 o 8, dicendo lungo 2 byte, lungo 4 byte ecc

lascia supporre che sia 4.

È ora desidera che il il valore massimo di 4 byte può essere memorizzato, il valore massimo per un byte è (in hex) 0xFF. Il valore massimo di quattro byte è 0x seguito da 8 f (una coppia di f per ogni byte, il 0x dice al compilatore che la seguente stringa è un numero esadecimale). Ora modificare il programma per assegnare tale valore e stampare il risultato

unsigned int ui = 0xFFFFFFFF; 
std::cout << ui; 

Quello è il valore massimo un unsigned int può contenere, mostrata in base 10 di rappresentanza.

Ora fallo per lunghi, corti e qualsiasi altro valore di INTEGER di cui sei curioso.

NB: questo approccio non funziona per i numeri in virgola mobile (vale a dire doppio o float).

Spero che questo aiuti

+1

Se provi questo con le firme firmate, ottieni numeri negativi. Leggi su "complimento di due" (link fornito), è facile ottenere l'intera gamma (positiva e negativa) anche per questi. http://en.wikipedia.org/wiki/Twos_Compliment –

2

Per unsigned tipo di dati non v'è alcun bit del segno e tutti i bit sono per i dati ; mentre per il tipo di dati firmato viene indicato il bit di segno e i bit rimanenti sono per i dati.

Per trovare la gamma fare le seguenti cose:

Fase: 1 -> Per saperne di alcuna di byte per il tipo di dati danno.

Passo: 2 -> Applica i seguenti calcoli.

 Let n = no of bits in data type 

     For signed data type :: 
      Lower Range = -(2^(n-1)) 
      Upper Range = (2^(n-1)) - 1) 

     For unsigned data type :: 
      Lower Range = 0 
      Upper Range = (2^(n)) - 1 

Ad es.

Per unsigned int size = 4 byte (32 bit) -> Intervallo [0, (2^(32)) - 1]

Per Acceso size = 4 byte int (32 bit) -> Intervallo [- (2^(32-1)), (2^(32-1)) - 1]

5

Per scoprire i limiti sistema:

#include <iostream> 
#include <limits> 
int main(int, char **) { 
    std::cout 
    << static_cast<int>(std::numeric_limits<char>::max()) << "\n" 
    << static_cast<int>(std::numeric_limits< unsigned char >::max()) << "\n" 
    << std::numeric_limits<short>::max() << "\n" 
    << std::numeric_limits< unsigned short >::max() << "\n" 
    << std::numeric_limits<int>::max() << "\n" 
    << std::numeric_limits< unsigned int >::max() << "\n" 
    << std::numeric_limits<long>::max() << "\n" 
    << std::numeric_limits< unsigned long >::max() << "\n" 
    << std::numeric_limits< long long >::max() << "\n" 
    << std::numeric_limits< unsigned long long >::max() << "\n"; 
} 

noti che long long è legale solo in C99 e in C++ 11.

3

In C++, ora int e altri dati vengono memorizzati utilizzando il metodo di complimento di 2. Ciò significa che l'intervallo è:

-2147483648 to 2147483647 

o -2^31 a 2^31-1

1 bit è riservato 0 valore in modo positivo è uno meno di 2^(31)

Problemi correlati