Hva er hva? · bei.pm

Denne teksten ble automatisert oversatt av OpenAI GPT-4o Mini.

I denne kategorien finnes det artikler om filformater og reverse engineering.

Men slik er det:
Det finnes mange programmeringsspråk der ute, og mange mennesker kjenner til visse ting under helt andre navn - eller har rett og slett ingen anelse om eksistensen av de mest grunnleggende tingene, fordi deres programmeringsspråk abstraherer dette bort fra dem.

tl;dr:
Min notasjon er grovt basert på C99 <stdint.h>. Den som kan bruke denne notasjonen, vil sikkert klare seg med min notasjon.

Heltall

Heltall er enkelt sagt hele tall, det vil si tall uten desimaldel.

Heltall er som regel definert innenfor et fast tallområde i dataformater, i praksis en oppløsning. Jeg angir dette i biter - fordi et "byte" og de påfølgende typene (Word, Qword, ...) vanligvis er plattformavhengige.

I tillegg skiller man mellom naturlige tall (ℕ, det vil si, uten fortegn - Unsigned) og heltall (ℤ, det vil si, med fortegn - Signed).
Denne informasjonen er synlig gjennom et fortegn i betegnelse (u eller s).

Det er mulig at fortegnsbehandlede heltall enten representeres som eners komplement eller toers komplement.
Så lenge det ikke er angitt noe annet, brukes toers komplement, da det er den foretrukne representasjonen i moderne informatikk.

Utenfortegnede tall angir jeg i dokumentasjonen mine som uint, med påfølgende angivelse av nøyaktigheten i biter.
Fortegnsbehandlede tall angir jeg i dokumentasjonen mine som sint, også med påfølgende angivelse av nøyaktigheten i biter.

Jeg unngår å bruke datatypen "char" for tegn, da tegnstrenger vanligvis bare representerer kjeder av heltall med en spesiell tolkning.
Disse blir derfor representert som uint(8)[].

Eksempler:

Notasjon C99 stdint.h-tilsvarende Beskrivelse Tallområde
uint(16) uint16_t Usignert heltall, 16 bits lengde 0 - 65.535
sint(8) int8_t Signert heltall, 8 bits lengde, to-komplement -126 - 127
uint(24) uint32_t:24 Usignert heltall, 24 bits lengde 0 - 16.777.216

Fastkomma-verdier

Fastpunktverdier er tallverdier fra spekteret av rasjonale tall (Q), som derfor har et punkt samt desimaler.

For fastpunktverdier er - derav navnet - posisjonen til punktet fastsatt av datatypen.
Dette medfører også et fast tallområde for tall av denne datatypen; matematisk uttrykt er tallrommet endelig.

I praksis brukes denne datatypen hovedsakelig på plattformer uten tilstrekkelig rask flyttalls-hardware, da beregning av fastpunktverdier kan utføres med heltallsenheter.

Datatypen brukes også for eksempel av databaseadministrasjonssystemer når faste krav må oppfylles.
Man kan tenke på systemer for permanent lagring av finansdata; de fleste valutaer har begrenset til 2 desimaler. (Det er dog ikke klokt å bruke fastpunktverdier for dette; det er smartere å lagre den minste valutaenheten som heltall og la resten av representasjonsnivået være)

På samme måte som med heltallsangivelser gir jeg for fastpunktverdier oppløsningen av tallet før og etter punktet:
ufixed(9,7) betegner en datatype som reserverer 9 biter for verdien før punktet, samt 7 biter for verdien etter punktet; totalt 16 biter bred, og kan for eksempel 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 bort 28 tall, ettersom man sannsynligvis ville begrense seg til maksimalt (511,99) i praksis.

I stedet for en direkte tolkning av fastpunktverdien som en vektor av 2 separate heltall - noe som nesten alltid betyr et ubenyttet dataområde ved konvertering til desimaltall og en manuell overføring - kan i stedet desimalområdet tolkes som en brøk av den totale oppløsningen.
Med eksemplet fra 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 For å konvertere til en desimalrepresentasjon må derfor desimalen deles med 128.
Med denne varianten kan regneoperasjoner utføres enklere, da overføringen skjer automatisk, noe som gjør denne varianten generelt foretrukket.
Denne varianten har imidlertid ulempen at desimalene i desimalrepresentasjonen ikke lenger har en garantert oppløsning, en enkelt desimalplass har derfor ikke verdien 0.01, men 0.007874, noe som vil føre til tilsvarende avrundingsfeil.

Hvilken tolkning som brukes, dokumenteres ved bruksstedet.

Flyttallsverdier

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

En flyttallsverdi består vanligvis av følgende komponenter:

Fortegn (0 eller 1) Eksponent Mantisse

Mens fortegnet kan utledes enkelt som en binær ja/nei-informasjon, dannes det faktiske tallet gjennom ligningen
Mantisse * 2Eksponent

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

Flyttallsverdier er spesielt nyttige når nøyaktigheten ikke er så viktig, da det med denne typen verdier nødvendigvis oppstår avrundingsfeil og dermed tap av nøyaktighet. 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, vil dette bli angitt tilsvarende.