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.
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]
LOCAL, GLOBAL,
Parameter, Array-Element, Ausdruckswert und FOR-Schleifenvariable.UNL ist dort
kein Quelltext-Datentyp.PIC-Felder und
Dezimalfunktionen; UNL ist dort kein benannter Quelltext-Datentyp.LOCAL n AS UNL
DIM values(1 TO 10) AS UNL
n = VALUNL("123456789012345678901234567890")
PRINT UNL$(n)
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.
| Aufgabe | Verwendung | Hinweise |
|---|---|---|
Text nach UNL einlesen | VALUNL(text$) | Der Text muss eine gültige vorzeichenbehaftete Dezimalzahl sein. |
UNL als Text ausgeben | UNL$(value) | Gibt die kanonische Dezimaldarstellung zurück. |
| Kleine Literale zuweisen | n = 42 | Feste Integer-Werte werden automatisch konvertiert. |
| Sehr große Werte zuweisen | n = VALUNL("...") | Für Werte außerhalb normaler numerischer Literale Zeichenketten verwenden. |
| Kategorie | Unterstützte Operationen | Hinweise |
|---|---|---|
| Arithmetik | +, -, *, Ganzzahldivision, Rest, Negation | Operanden werden nach jeder Operation normalisiert. |
| Bitweise Operationen | Nicht für UNL-Werte verfügbar. | Für Bitmasken feste Integer-Typen verwenden. |
| Shift | SHL, SHR | Implementiert als Multiplikation oder Division durch Zweierpotenzen. |
| Vergleich | =, <>, <, <=, >, >= | Vergleicht zuerst das Vorzeichen, dann die normalisierte Größe. |
| Schleifen | FOR i = VALUNL(...) TO VALUNL(...) | Positive und negative Integer-Schritte werden unterstützt. |
| Anforderung | Empfohlen |
|---|---|
| Schnelle normale Ganzzahlarithmetik | LONG oder QUAD |
| Bekannte feste Maximalbreite | INT128, INT256, INT512 |
| Ganzzahlen, die ohne festes Limit wachsen können | UNL |
| Dezimal-/wissenschaftliche Werte mit einstellbarer Divisionsgenauigkeit | UNF / UNB mit UNFPRECISION(n) |
| Exakte COBOL-Festkommafelder | COBOL-PIC-Numerikfelder |
LONG, QUAD oder Wide-Integer-Typen
meist besser.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 Variablenseiten sollen Breite, Vorzeichen, Initialisierung, Gültigkeitsbereich, Suffixregeln und x64-Layout dokumentieren. Beispiele sollen gespeicherten Wert, ausgelesenen Wert und Konvertierungs- oder Überlaufverhalten belegen.
Nennen Sie, ob Deklarationen #DIM ALL, AS-Klauseln, Suffixe oder ausdrückliche Sichtbarkeit benötigen. Trennen Sie lokalen, statischen, globalen und thread-lokalen Speicher.
Prüfen Sie Pointer-, Handle- und LONG-Annahmen beim Wechsel von 32-Bit-PB-Code zu PBXB64.
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.
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