Kva er kva? · bei.pm

Denne teksten vart automatisert omsett av OpenAI GPT-4o Mini.

I denne seksjonen finst det artiklar om filformat og revers engineering.

Men slik er det:
Det finst mange programmeringsspråk der ute, og mange folk kjenner visse ting under heilt andre namn - eller har ikkje peiling på eksistensen av dei mest grunnleggjande tinga, fordi programmeringsspråket deira abstraherer det bort frå dei.

tl;dr:
Mi notasjon er grovt basert på C99 <stdint.h>. Den som kan forstå denne notasjonen, vil heilt sikkert klare å bruke mi notasjon.

Heiltal

Heltall er enkelt sagt heiltal, altså tal utan desimaldel.

Heltal er som regel definert innanfor eit fast talområde i datatypar, nesten som ei oppløysing. Eg oppgir dette i bit - fordi ein "byte" og deretter bygde typar (Word, Qword, ...) i stor grad er plattformavhengige.

I tillegg skiller ein mellom naturlege tal (ℕ, altså utan teikn - Unsigned) og heiltal (ℤ, altså med teikn - Signed).
Denne informasjonen kjem fram gjennom eit teikn i identifikatoren (u eller s).

Det er mogleg at teiknafte heiltal er representert som einarkomplement eller som toarkomplement.
Så lenge det ikkje er oppgitt noko anna, blir toarkomplement brukt, sidan det er den føretrekte representasjonen i moderne informatikk.

Uteikna tal blir oppgitt av meg i dokumentasjonen som uint, med påfølgjande oppgjeving av nøyaktigheit i Bits.
Teiknafte tal blir oppgitt av meg i dokumentasjonen som sint, også med påfølgjande oppgjeving av nøyaktigheit i Bits.

Eg unngår å bruke datatypen "char" for teikn, sidan tekststrenger som regel berre representerer heiltal med ei spesiell tolking.
Desse blir difor representert som uint(8)[].

eksempel:

Notasjon C99 stdint.h-ekvivalent Beskriving Tallområde
uint(16) uint16_t Usignert heiltal, 16 bit lengde 0 - 65.535
sint(8) int8_t Signert heiltal, 8 bit lengde, to-komplement -126 - 127
uint(24) uint32_t:24 Usignert heiltal, 24 bit lengde 0 - 16.777.216

Fastkomma-verdier

Fast desimalverdier er tallverdier fra spekteret av Rasjonale tall (Q), som dermed har et komma samt desimaler.

For fast desimalverdier er - derav navnet - posisjonen til kommaet fastsatt av datatypen.
Dette gir et fast tallområde for tall av denne datatypen; matematikalsk uttrykt er tallrommet begrenset.

I virkeligheten brukes denne datatypen primært på plattformer uten tilstrekkelig rask flyttalls-hardware, da beregningen av fast desimalverdier kan utføres av heltallsenheter.

Datatypen brukes også av for eksempel databaseadministrasjonssystemer når faste krav må oppfylles.
Tenk for eksempel på systemer for permanent lagring av finansdata; de fleste valutaer begrenser seg til 2 desimaler. (Men det er ikke smart å bruke fast desimalverdier for dette; det er smartere å lagre den minste valutaenheten direkte som et heltall og la resten av representasjonsnivået være.)

I likhet med heltallsangivelser angir jeg oppløsningen av tallet før og etter kommaet for fast desimalverdier:
ufixed(9,7) betegner en datatype som reservert 9 biter for verdien før kommaet, samt 7 biter for verdien etter kommaet; totalt er den derfor 16 biter bred og kan dekke et område fra (0,0) til (511,127) som en vektor av to uavhengige heltall.
Denne tolkningen ville imidlertid i sin desimalrepresentasjon gi 28 tall som ikke blir brukt, da man sannsynligvis ville begrense seg til maksimalt (511,99) i praksis.

I stedet for en direkte tolkning av fast desimalverdien som en vektor av 2 separate heltall - noe som nesten alltid gir et ubrukt datområde ved konvertering til desimaltall og en manuell overføring - kan i stedet desimalområdet tolkes som brøk av hele oppløsningen.
I eksempelet med den nettopp nevnte ufixed(9,7) får vi derfor en brøk med en nevner på 27 - tallområdet går da fra 0,00 til 511 + 126127 Til konvertering til en desimalrepresentasjon ville desimalplassen derfor deles med 128.
Med denne varianten kan regneoperasjoner utføres enklere, da overføringen skjer automatisk, noe som gjør at denne varianten vanligvis foretrekkes.
Denne varianten har imidlertid den ulempen at desimalene i desimalrepresentasjonen ikke lenger har en garantert oppløsning, en enkelt desimalplass vil derfor ikke lenger ha verdien 0.01, men 0.007874, noe som vil føre til tilsvarende avrundingsfeil.

Hvilken tolkning som brukes, vil bli dokumentert ved bruksstedet.

Flyttals- eller glidande talverdiar

Flyttallsverdier er matematisk mer komplekse uttrykk, der et heltall med fast oppløsning uttrykkes gjennom et matematisk uttrykk slik at desimaldelen effektivt dannes ved forskyvning - og dermed er umiddelbart relatert til vitenskapelig notasjon.
Den vanligste måten å implementere dette på har blitt standardisert med IEEE 754 og har siden blitt internasjonalt anerkjent.

Ett flyttall består vanligvis av følgende komponenter:

Fortegn (0 eller 1) Eksponent Mantisse

Mens fortegnet kan utledes enkelt som binær ja/nei-informasjon, dannes selve tallet gjennom likningen
Mantisse * 2Eksponent

I tillegg finnes det en rekke konstant verdier som dekker spesielle tilfeller av rasjonale tall - inkludert ±∞ og NaN ("ikke et gyldig tall").

Flyttallsverdier er særlig nyttige når nøyaktighet ikke er så viktig, ettersom det uunngåelig oppstår avrundingsfeil og dermed tap av nøyaktighet med denne typen verdier. Typisk brukes flyttallsverdier for eksempel til å definere koordinater, som vertex-vektorer i 3D-modeller eller Bézier-/Spline-kurver for optiske representasjonsformål.

I dataformater spesifiseres flyttallsverdier som float(Mantisse, Eksponent).
Hvis et format som avviker fra IEEE 754 brukes, angis dette tilsvarende.