Quale intervallo di valori possono essere archiviati i tipi interi in C++

StackOverflow https://stackoverflow.com/questions/1819189

  •  10-07-2019
  •  | 
  •  

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?

È stato utile?

Soluzione

Gli intervalli minimi su cui puoi fare affidamento sono:

  • short int e int: da -32.767 a 32.767
  • unsigned short int e unsigned 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.

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