Quale intervallo di valori possono essere archiviati i tipi interi in C++
Domanda
Potere unsigned long int
contenere un numero di dieci cifre (1.000.000.000 - 9.999.999.999) su un computer a 32 bit?
Inoltre, quali sono gli intervalli di unsigned long int
, long int
, unsigned int
, short int
, short unsigned int
, E int
?
Soluzione
Gli intervalli minimi su cui puoi fare affidamento sono:
-
short int
eint
: da -32.767 a 32.767 -
unsigned short int
eunsigned int
: da 0 a 65.535 -
long int
: da -2.147.483.647 a 2.147.483.647 -
unsigned long int
: da 0 a 4.294.967.295
Ciò significa che non è possibile fare affidamento su long long int
per memorizzare un numero di 10 cifre. Tuttavia, un tipo più grande unsigned 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 meno recenti che non lo includevano). L'intervallo minimo per questo tipo, se supportato dal compilatore, è:
- <=>: da -9.223.372.036.854.775.807 a 9.223.372.036.854.775.807
- <=>: da 0 a 18.446.744.073.709.551.615
Quindi quel tipo sarà abbastanza grande (di nuovo, se lo hai disponibile).
Una nota per coloro che credono di aver fatto un errore con questi limiti inferiori - non l'ho fatto. I requisiti C per gli intervalli sono scritti per consentire le rappresentazioni intere del complemento o della grandezza del segno, in cui il valore rappresentabile più basso e il valore rappresentabile più elevato differiscono solo nel segno. È anche consentito avere una rappresentazione del complemento a due in cui il valore con il bit di segno 1 e tutti i bit di valore 0 è una rappresentazione trap anziché un valore legale. In altre parole, <=> non è non necessario per poter rappresentare il valore -32.768.
Altri suggerimenti
La dimensione dei tipi numerici non è definita nello standard C++, sebbene le dimensioni minime lo siano.Il modo per sapere quali dimensioni sono sulla tua piattaforma è usare limiti numerici
Ad esempio, il valore massimo per un int può essere trovato da:
std::numeric_limits<int>::max();
I computer non funzionano in base 10, il che significa che il valore massimo sarà sotto forma di 2N-1 a causa di come i numeri vengono rappresentati in memoria.Prendiamo ad esempio otto bit (1 byte)
0100 1000
Il bit (numero) più a destra quando impostato su 1 rappresenta 20, la parte successiva 21, quindi 22 e così via fino ad arrivare al bit più a sinistra che se il numero non ha segno rappresenta 27.
Quindi il numero rappresenta 26 + 23 = 64 + 8 = 72, perché vengono impostati il 4° bit da destra e il 7° bit da destra.
Se impostiamo tutti i valori su 1:
11111111
Il numero è ora (assumendo non firmato)
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 = 28 - 1
E come possiamo vedere, questo è il valore più grande possibile che può essere rappresentato con 8 bit.
Sulla mia macchina int e a long sono uguali, ciascuno in grado di contenere tra -231 a 231 -1.Nella mia esperienza la dimensione più comune sui moderni computer desktop a 32 bit.
Per scoprire i limiti sul tuo 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";
}
Nota che long long
è legale solo in C99 e in C ++ 11.
Altre persone qui pubblicheranno collegamenti a dimensioni e precisioni di dati ecc.
Ti dirò come capirlo da soli.
Scrivi una piccola app che eseguirà le seguenti operazioni.
unsigned int ui;
std::cout << sizeof(ui));
questo (a seconda del compilatore e dell'archivio) stamperà 2, 4 o 8, dicendo 2 byte di lunghezza, 4 byte di lunghezza ecc.
Supponiamo che sia 4.
Ora si desidera memorizzare il valore massimo di 4 byte, il valore massimo per un byte è (in esadecimale) 0xFF. Il valore massimo di quattro byte è 0x seguito da 8 f (una coppia di f per ogni byte, lo 0x indica al compilatore che la stringa seguente è un numero esadecimale). Ora cambia il tuo programma per assegnare quel valore e stampare il risultato
unsigned int ui = 0xFFFFFFFF;
std::cout << ui;
Questo è il valore massimo che può contenere un int senza segno, mostrato nella rappresentazione di base 10.
Ora fallo per lunghi, pantaloncini e qualsiasi altro valore INTEGER di cui sei curioso.
NB: questo approccio non funziona con numeri in virgola mobile (ovvero double o float).
Spero che questo aiuti
In C ++, ora int e altri dati sono memorizzati usando il metodo di complimento di 2. Ciò significa che l'intervallo è:
-2147483648 to 2147483647
o -2 ^ 31 a 2 ^ 31-1
1 bit è riservato a 0, quindi il valore positivo è uno in meno di 2 ^ (31)
Per tipo di dati senza segno non è presente alcun bit di segno e tutti i bit sono per i dati ; mentre per tipo di dati firmati MSB è indicato bit di segno e bit rimanenti sono per dati.
Per trovare l'intervallo, procedi come segue:
Passaggio: 1 - > Scopri no di byte per il tipo di dati dare.
Passaggio: 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 esempio
Per dimensioni int senza segno = 4 byte (32 bit) - > Intervallo [0, (2 ^ (32)) - 1]
Per dimensioni int con segno = 4 byte (32 bit) - > Intervallo [- (2 ^ (32-1)), (2 ^ (32-1)) - 1]
No, solo una parte del numero di dieci cifre può essere memorizzata in un int lungo senza segno il cui intervallo valido è compreso tra 0 e 4.294.967.295. puoi fare riferimento a questo: http://msdn.microsoft.com/en-us /library/s3f49ktz(VS.80).aspx
Può un unsigned long int contenere un numero di dieci cifre (1.000.000.000 - 9.999.999.999) su un computer a 32 bit.
No
Dovresti guardare le specializzazioni dei valori numerici < > modello per un determinato tipo. È nell'intestazione.