2010-11-23 8 views
0

Wie werden Werte dargestellt, die die Höchstwerte eines bestimmten Datentyps (int, long) überschreiten?Wie wird eine Zahl dargestellt, die größer als der Maximalwert ist?

Ich denke an einen anderen Speicherplatz, der wie ein Zähler funktioniert. Sobald der Maximalwert überschritten ist, wird der Zähler aktualisiert, um zu sagen, dass die Variable den Grenzwert für die Anzahl "x" überschritten hat. Gibt es einen anderen effizienten Weg?

Wie zeigen wir den genauen Wert an?

P.S: Nur eine hypothetische Frage.

Antwort

2

Eine Möglichkeit besteht darin, einen der Werte für diesen Zweck herauszufiltern. Wenn Sie beispielsweise einen 16-Bit-Ganzzahltyp haben, der die Werte von 0 bis einschließlich 65535 darstellen kann, reduzieren Sie den Bereich auf 0 bis 65534, und verwenden Sie 65535, um den Wert "zu groß" darzustellen.

Sie müssten vorsichtig sein, um die Operationen so zu steuern, dass sie diesen Wert im normalen Verlauf der Ereignisse nicht erzeugen, aber das ist ziemlich einfach, wenn Ihre Sprache Klassenfunktionen bereitstellt.

Alternativ können Sie den nächstgrößere Datentyp wie long für int oder long long für long und nutzen die zusätzliche Reichweite Informationen zu speichern, verwenden.

Und wenn Sie mehr als das brauchen, können Sie eine Bibliothek bignum (oder verwenden Sie eine, die bereits existiert), so dass Ihre Zahlen keine künstlichen Grenzen gesetzt sind.

1

Betrachten wir ein Standard IEEE-754 Schwimmer und die "Infinity" Bit-Muster. Man könnte ein ähnliches Bitmuster in einem festen int/long speichern, um "Infinity" zu bedeuten. Die CPU wird Ihnen jedoch nicht bei den Mathematik-/Überlauf-Zuständen helfen, wie dies bei den meisten FPUs der Fall ist.

Einige Sprachen wie Ruby oder elisp "reservieren" bereits Bits in Ganzzahlen (z. B. ist eine Fixnummer in Ruby auf [-2^29,2^29-1] beschränkt, da 2 Bits für die Objektverwaltung verwendet werden). Die Verwendung eines bestimmten Bitmusters vs. Bit würde nur einen möglichen Wert entfernen.

Wenn Sie sich über höheren Sprachen sprechen, sagen wir, C#, dann ist es einfach, einen benutzerdefinierten Typ zu definieren:

struct IntWithStuff { 
    int value; 
    bool isTooBig; 
} 

Sie auch die verschiedenen Betreiber überlasten könnten und einige (explizite) implementieren wirft, aber Ich schweife ab ...

Verwandte Themen