Domanda

Questa è una domanda molto semplice (credo), c'è un metodo libreria STL che fornisce il limite di un tipo di variabile (ad esempio integer) ? so che questi limiti differiscono su diversi computer, ma ci deve essere un modo per riuscire a superare un metodo, giusto?

Inoltre, sarebbe davvero difficile scrivere un metodo per calcolare il limite di un tipo di variabile?

Sono solo curioso! :)

Grazie;).

È stato utile?

Soluzione

std::numeric_limits :

// numeric_limits example
// from the page I linked
#include <iostream>
#include <limits>
using namespace std;

int main () {
  cout << boolalpha;
  cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
  cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
  cout << "int is signed: " << numeric_limits<int>::is_signed << endl;
  cout << "Non-sign bits in int: " << numeric_limits<int>::digits << endl;
  cout << "int has infinity: " << numeric_limits<int>::has_infinity << endl;
  return 0;
}

Altri suggerimenti

Vedo che la risposta 'giusta' è già stata data: Usa <limits> e lasciare che la magia accade. Mi capita di scoprire che la risposta insoddisfacente, dal momento che la domanda è:

Sarebbe davvero difficile scrivere un metodo per calcolare il limite di un tipo di variabile?

La risposta è: facile per i tipi interi, duri per i tipi di float. Ci sono 3 tipi fondamentali di algoritmi si avrebbe bisogno di fare questo. firmata, senza segno, e in virgola mobile. ciascuno ha un algoritmo diverso per come si ottiene il minimo e massimo, e il codice effettivo comporta alcuni bit giocherellando, e nel caso di virgola mobile, è necessario ciclo se non si dispone di un tipo noto intero che è la stessa dimensione del galleggiante tipo.

Quindi, eccolo qui.

Unsigned è facile. il minimo è quando tutti i bit sono 0 di, il massimo è quando tutti i bit sono 1 di.

const unsigned type unsigned_type_min = (unsigned type)0;    
const unsigned type unsigned_type_max = ~(unsigned type)0;

Per firmato, il minimo è quando il bit del segno è impostato, ma tutti gli altri bit sono zero, il massimo è quando sono impostati tutti i bit ad eccezione del bit del segno. con fuori conoscere la dimensione del tipo, non sappiamo dove il bit di segno è, ma possiamo usare alcuni trucchi bit per farlo funzionare.

const signed type signed_type_max = (signed type)(unsigned_type_max >> 1);
const signed type signed_type_min = (signed type)(~(signed_type_max));

per virgola mobile, ci sono 4 limiti, anche se knowning solo i limiti positivi è sufficiente, i limiti negativi sono solo segno invertito limiti positivi. C'è un potenzialmente molti modi per rappresentare numeri in virgola mobile, ma per coloro che utilizzano binario (anziché base 10) in virgola mobile, quasi tutti usano rappresentazioni IEEE.

Per galleggianti IEEE, il valore in virgola mobile positivo più piccolo è quando il bit basso dell'esponente è 1 e tutti gli altri bit sono 0 di. Il valore più grande negativo virgola mobile è l'inverso bit di questo. Tuttavia, senza un tipo intero che è noto per essere la stessa dimensione del dato tipo virgola mobile, non c'è alcun modo per fare questo manipolazione bit diverso esecuzione di un ciclo. se si dispone di un tipo integer che si sa è la stessa dimensione come tipo di virgola mobile, si può fare questo come una singola operazione.

const float_type get_float_type_smallest() {
   const float_type float_1 = (float_type)1.0;
   const float_type float_2 = (float_type)0.5;
   union {
      byte ab[sizeof(float_type)];
      float_type fl;
      } u;
   for (int ii = 0; ii < 0; ++ii)
      u.ab[ii] = ((byte*)&float_1)[ii] ^ ((byte*)&float_2)[ii];
   return u.fl;
   }

const float_type get_float_type_largest() {
   union {
      byte ab[sizeof(float_type)];
      float_type fl;
      } u;
   u.fl = get_float_type_smallest();
   for (int ii = 0; ii < 0; ++ii)
      u.ab[ii] = ~u.ab[ii];
   return -u.fl; // Need to re-invert the sign bit.
   }

(relativo a C, ma credo che questo vale anche per il C ++)

Si può anche provare " informarsi ", che è uno script che può ricreare limits.h per il vostro compilatore. Una citazione dalla home page del projetc:

  

Questo è un programma che determina molti   proprietà del compilatore C e   macchina che viene eseguito su, ad esempio   minima e massima [un] firmato   car / int / lunghi, molte proprietà di   galleggiante / [lungo] doppio, e così via.

     

Come opzione produce l'ANSI C   float.h e file limits.h.

     

Come ulteriore opzione, anche i controlli   che il compilatore legge l'intestazione   file in modo corretto.

     

Si tratta di un buon banco di prova per i compilatori,   dal momento che li esercita con molte   valori limite, come minimo   e numeri massimi in virgola mobile.

#include <limits>

std::numeric_limits<type>::max() // min() etc
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top