Wat is wat? · bei.pm

Deze tekst is automatisch vertaald door OpenAI GPT-4o Mini.

In deze rubriek zijn er artikelen over bestandsformaten en reverse engineering.

Maar zo is het:
Er zijn veel programmeertalen en veel mensen die bepaalde dingen onder totaal andere namen kennen - of helemaal geen idee hebben van het bestaan van fundamentele zaken, omdat hun programmeertaal dit voor hen abstraheert.

tl;dr:
Mijn notatie is grofweg gebaseerd op C99 <stdint.h>. Wie iets met deze notatie kan, zal zeker met mijn notatie overweg kunnen.

Geheel getal

Integer zijn simpelweg gehele getallen, dat wil zeggen getallen zonder decimalen.

Integer zijn in gegevensformaten doorgaans gedefinieerd binnen een vast bereik van waarden, eigenlijk een resolutie. Deze geef ik aan in bits - om de reden dat een "byte" en daaruit voortvloeiende types (Word, Qword, ...) meestal platformafhankelijk zijn.

Tevens maakt men bij Integer-types ook nog onderscheid tussen natuurlijke getallen (ℕ, oftewel, zonder teken - Unsigned) en gehele getallen (ℤ, oftewel, met teken - Signed).
Deze informatie is zichtbaar via een teken in de aanduiding (u of s).

Het is mogelijk dat getekende gehele getallen worden weergegeven als Een's complement of als Twee's complement.
Tenzij anders aangegeven, wordt Twee's complement gebruikt, omdat dit in de moderne informatica de voorkeur geniet.

Ongetekende getallen worden door mij in mijn documentatie aangeduid als uint, met daaropvolgende vermelding van de precisie in bits.
Getekende getallen worden door mij in mijn documentatie aangeduid als sint, ook met daaropvolgende vermelding van de precisie in bits.

Ik maak geen gebruik van het gegevenstype "char" voor tekens, omdat tekenreeksen doorgaans alleen reeksen van integerwaarden met een speciale interpretatie weergeven.
Dit wordt daarom weergegeven als uint(8)[].

Voorbeelden:

Notatie C99 stdint.h-Equivalent Beschrijving Cijferbereik
uint(16) uint16_t Unsigned Integer, 16 Bit lengte 0 - 65.535
sint(8) int8_t Signed Integer, 8 Bit lengte, Tweede complement -126 - 127
uint(24) uint32_t:24 Unsigned Integer, 24 Bit lengte 0 - 16.777.216

Vaste-komma-waarden

Vaste komma-waarden zijn getalwaarden uit het spectrum van Rationale getallen (Q), die dus over een komma en decimalen beschikken.

Bij vaste komma-waarden is - vandaar ook de naam - de positie van de komma vastgelegd door het gegevenstype.
Daardoor ontstaat ook een vaste getallenbereik voor getallen van dit gegevenstype; wiskundig uitgedrukt is het getallenbereik eindig.

In de praktijk wordt dit gegevenstype voornamelijk gebruikt op platforms zonder voldoende snelle drijvende-komma-hardware, omdat de berekening van vaste komma-waarden kan plaatsvinden door integer-eenheden.

Ook wordt het gegevenstype bijvoorbeeld door databasebeheersystemen gebruikt wanneer vaste vereisten moeten worden vervuld.
Denk hierbij aan systemen voor permanente opslag van financiële gegevens; de meeste valuta's beperken zich tot 2 decimalen. (Het is echter niet verstandig om hiervoor vaste komma-waarden te gebruiken; het is slimmer om in plaats daarvan de kleinste munteenheid als integer op te slaan en de rest van de weergave aan de weergave-laag over te laten)

Analoge aan de integer-aanduidingen geef ik bij vaste komma-waarden de resolutie van het getal voor en na de komma aan:
ufixed(9,7) verwijst naar een gegevenstype dat 9 bits zonder teken voor de waarde vóór de komma en 7 bits voor de waarde na de komma reserveert; in totaal is het dus 16 bits breed en kan het bijvoorbeeld als een vector van twee onafhankelijke integers een bereik van (0,0) tot (511,127) dekken.
Dit zou echter in zijn decimale weergave 28 getallen onbenut laten, omdat men waarschijnlijk eerder zou beperken tot maximaal (511,99) in de praktijk.

In plaats van een directe interpretatie van de vaste komma-waarde als een vector van 2 afzonderlijke integers - wat vrijwel altijd een onbenut gegevensgebied betekent bij de omzetting naar decimale getallen en een handmatige overdracht - kan in plaats daarvan het decimale gedeelte ook als een breuk van de totale resolutie worden geïnterpreteerd.
Op basis van de eerder genoemde ufixed(9,7) ontstaat zo een breuk met een noemer van 27 - het getallenbereik gaat dan van 0,00 tot 511 + 126127 Voor de omzetting naar een decimale weergave zou het decimale gedeelte dus door 128 moeten worden gedeeld.
Met deze variant kunnen eenvoudiger rekenoperaties worden uitgevoerd, omdat de overdracht automatisch plaatsvindt, waardoor deze variant doorgaans geprefereerd wordt.
Deze variant heeft echter het nadeel dat de decimalen in de decimale weergave niet meer over een gegarandeerde resolutie beschikken, waardoor een enkele decimaal niet meer de waarde 0.01, maar 0.007874 heeft, wat kan leiden tot bijbehorende afrondingsfouten.

Welke interpretatiemethode wordt gebruikt, wordt documenteerd op de gebruiksplaats.

Vloeiende of drijvende waarden

Drijvende-komma waarden zijn mathematisch complexere uitdrukkingen, waarbij een geheel getal met vaste resolutie over een wiskundige term zo wordt uitgedrukt dat het effectief het decimale deel door verschuiving wordt gevormd - en zich daarmee onmiddellijk richt naar de wetenschappelijke notatie.
De gebruikelijkste manier om dit te implementeren, is gestandaardiseerd met IEEE 754 en is sindsdien internationaal erkend.

Over het algemeen bestaat een drijvende-komma waarde uit de volgende componenten:

Teken (0 of 1) Exponent Mantisse

Hoewel het teken als binaire ja/nee-informatie eenvoudig kan worden afgeleid, wordt het eigenlijke getal gevormd door de vergelijking
Mantisse * 2Exponent

Bovendien zijn er een aantal vaste waarden die bijzondere gevallen rationele getallen dekt - waaronder ±∞ en NaN ("geen geldig getal").

Drijvende-komma waarden zijn vooral nuttig wanneer de nauwkeurigheid niet zo belangrijk is, omdat er bij deze soort waarden onvermijdelijk afrondingsfouten en dus nauwkeurigheidsverlies optreden. Typisch worden drijvende-komma waarden daarom bijvoorbeeld gebruikt voor het definiëren van coördinaten, zoals vertex-vectoren in 3D-modellen of Bézier-/Spline-curven voor optische representatiedoeleinden.

In de gegevensformaten worden drijvende-komma waarden gespecificeerd als float(Mantisse, Exponent).
Als er een van IEEE 754 afwijkend formaat wordt gebruikt, wordt dit dienovereenkomstig aangegeven.