Startseite › Datentypen › BASIC-Datentypen Hilfe zum PBXB64-Compiler

UNL - Ganzzahl mit unbegrenzter Genauigkeit

UNL ist der vorzeichenbehaftete Ganzzahltyp mit unbegrenzter Genauigkeit im PB/BASIC-Frontend. Verwenden Sie ihn, wenn LONG, QUAD oder die festen Wide-Integer-Typen nicht groß genug sind und der Wert exakt bleiben muss.

Kategorie: BASIC-Datentypen | Zertifizierung: [ZERTIFIZIERT GETESTET]

Beschreibung

UNL ist der vorzeichenbehaftete Ganzzahltyp mit unbegrenzter Genauigkeit im PB/BASIC-Frontend. Verwenden Sie ihn, wenn LONG, QUAD oder die festen Wide-Integer-Typen nicht groß genug sind und der Wert exakt bleiben muss.

Typ: Datentyp | Kategorie: Numerische Typen

PBXB64-Status: AVAILABLE

PBXB64-Zertifizierung: [ZERTIFIZIERT GETESTET]

Frontend-Unterstützung

Werte deklarieren

LOCAL n AS UNL
DIM values(1 TO 10) AS UNL

n = VALUNL("123456789012345678901234567890")
PRINT UNL$(n)

Genauigkeit und Wertebereich

UNL ist ein Ganzzahltyp. Deshalb gibt es keine Dezimalrundung, die man erhöhen oder verringern müsste. Addition, Subtraktion, Multiplikation, Ganzzahldivision, Rest, Vergleiche und Shifts arbeiten mit exakten Ganzzahlen. Die praktische Grenze ist verfügbarer Speicher und Rechenzeit, nicht eine feste Stellenzahl.

Wenn Sie einstellbare Dezimalgenauigkeit für Division brauchen, verwenden Sie die UNF-Familie und setzen Sie die Genauigkeit mit UNFPRECISION(n). Wenn eine feste Maximalbreite reicht, verwenden Sie INT128, INT256, INT512 oder die unsigned Varianten.

Konvertierung

AufgabeVerwendungHinweise
Text nach UNL einlesenVALUNL(text$)Der Text muss eine gültige vorzeichenbehaftete Dezimalzahl sein.
UNL als Text ausgebenUNL$(value)Gibt die kanonische Dezimaldarstellung zurück.
Kleine Literale zuweisenn = 42Feste Integer-Werte werden automatisch konvertiert.
Sehr große Werte zuweisenn = VALUNL("...")Für Werte außerhalb normaler numerischer Literale Zeichenketten verwenden.

Unterstützte Operationen

KategorieUnterstützte OperationenHinweise
Arithmetik+, -, *, Ganzzahldivision, Rest, NegationOperanden werden nach jeder Operation normalisiert.
Bitweise OperationenNicht für UNL-Werte verfügbar.Für Bitmasken feste Integer-Typen verwenden.
ShiftSHL, SHRImplementiert als Multiplikation oder Division durch Zweierpotenzen.
Vergleich=, <>, <, <=, >, >=Vergleicht zuerst das Vorzeichen, dann die normalisierte Größe.
SchleifenFOR i = VALUNL(...) TO VALUNL(...)Positive und negative Integer-Schritte werden unterstützt.

Den richtigen numerischen Typ wählen

AnforderungEmpfohlen
Schnelle normale GanzzahlarithmetikLONG oder QUAD
Bekannte feste MaximalbreiteINT128, INT256, INT512
Ganzzahlen, die ohne festes Limit wachsen könnenUNL
Dezimal-/wissenschaftliche Werte mit einstellbarer DivisionsgenauigkeitUNF / UNB mit UNFPRECISION(n)
Exakte COBOL-FestkommafelderCOBOL-PIC-Numerikfelder

Leistungshinweise

Verifikationshinweise

UNL-Code sollte Null, positive Werte, negative Werte, Wachstum über interne Grenzen hinweg und Rückkonvertierung nach Text testen. Division und Rest sollten exakte und nicht-exakte Division abdecken.

Typ- und Speicherprüfung

Typ- und Variablenseiten sollen Breite, Vorzeichen, Initialisierung, Gültigkeitsbereich, Suffixregeln und x64-Layout dokumentieren. Beispiele sollen gespeicherten Wert, ausgelesenen Wert und Konvertierungs- oder Überlaufverhalten belegen.

Deklarationsregeln

Nennen Sie, ob Deklarationen #DIM ALL, AS-Klauseln, Suffixe oder ausdrückliche Sichtbarkeit benötigen. Trennen Sie lokalen, statischen, globalen und thread-lokalen Speicher.

Migrationshinweise

Prüfen Sie Pointer-, Handle- und LONG-Annahmen beim Wechsel von 32-Bit-PB-Code zu PBXB64.

Umfangshinweise

Wenn eine Seite mehrere verwandte Formen gruppiert, sollte sie sagen, welche Form die Speicherbreite festlegt, welche nur die Deklarationssyntax ändert und welche nur historischen Charakter hat. Eine kleine Zuordnung von Familienbegriff zu den konkreten Typseiten macht die Seite beim Portieren deutlich nützlicher.

Beispiel

FUNCTION PBMAIN() AS LONG
    LOCAL a AS UNL
    LOCAL b AS UNL
    a = "123456789012345678901234567890"
    b = "987654321098765432109876543210"
    PRINT a + b          ' 1111111110111111111011111111110
    PRINT a * b          ' enormous, exact
    FUNCTION = 0
END FUNCTION

Siehe auch