Hvad er hvad? · bei.pm
I denne sektion er der artikler om filformater og reverse engineering.
Men sådan er det:
Der findes mange programmeringssprog derude, og mange mennesker kender nogle ting under helt andre navne - eller har slet ingen idé om eksistensen af de mest grundlæggende ting, fordi deres programmeringssprog abstraherer det væk fra dem.
tl;dr:
Min notation er groft baseret på C99 <stdint.h>
. Den, der kan arbejde med denne notation, vil helt sikkert kunne forstå min notation.
Hel tal
Integer er kort sagt heltal, altså tal uden decimaler.
Integer er i datatyper normalt defineret inden for et fast talområde, så at sige en opløsning. Jeg angiver dette i bit - fordi et "byte" og deraf følgende typer (Word, Qword, ...) typisk er platformafhængige.
Derudover skelner man også mellem naturlige tal (ℕ, altså uden fortegn - Unsigned) og hele tal (ℤ, altså med fortegn - Signed).
Denne information fremgår af et fortegn i betegnelse (u
eller s
).
Det er muligt, at fortegnsbeholdte heltal enten kan repræsenteres som Einerkomplement eller som Zweierkomplement.
Medmindre andet er angivet, anvendes Zweierkomplement, da det er den foretrukne repræsentation i moderne datalogi.
Uden fortegn tal angiver jeg i mine dokumenter som uint
, efterfulgt af angivelsen af præcision i Bits.
Fortegnsbeholdte tal angiver jeg i mine dokumenter som sint
, ligeledes efterfulgt af angivelsen af præcision i Bits.
Jeg undgår at bruge datatypen "char" til tegn, da strengene normalt kun repræsenterer kæder af Integer-værdier med en særlig fortolkning.
Disse repræsenteres derfor som uint(8)[].
Eksempler:
Notation | C99 stdint.h -ækvivalent |
Beskrivelse | Talområde |
---|---|---|---|
uint(16) | uint16_t | Unsigned Integer, 16 Bit længde | 0 - 65.535 |
sint(8) | int8_t | Signed Integer, 8 Bit længde, to-komplement | -126 - 127 |
uint(24) | uint32_t:24 | Unsigned Integer, 24 Bit længde | 0 - 16.777.216 |
Festkomma-værdier
Fast-komma-værdier er talværdier fra spektret af rationelle tal (Q), som derfor har et komma samt decimaler.
Med fast-komma-værdier er - derfor også navnet - positionen af kommaet fastsat af datatypen.
Dette resulterer også i et fast talområde for tal af denne datatype; matematisk udtrykt er talrummet ændeligt.
I virkeligheden anvendes denne datatype primært på platforme uden tilstrækkeligt hurtige flydende kommatilstandsenheder, da beregningen af fast-komma-værdier kan udføres af heltalsenheder.
Desuden anvendes datatypen for eksempel af databaseadministrationssystemer, når faste krav skal opfyldes.
Tænk her for eksempel på systemer til permanent opbevaring af finansdata; de fleste valutaer begrænser sig til 2 decimaler.
(Det er dog ikke klogt at bruge fast-komma-værdier til dette; det er smartere at gemme den mindste valutaenhed som heltal og overlade resten til præsentationsniveauet)
Analogt til heltalsangivelser angiver jeg for fast-komma-værdier opløsningen af tallet før og efter kommaet:
ufixed(9,7)
betegner en datatype, der uden fortegn reserverer 9 bit til værdien før kommaet og 7 bit til værdien efter kommaet; i alt altså 16 bit bred og kan således som en vektor af to uafhængige heltal dække et område fra (0,0) til (511,127).
Denne fortolkning ville dog i sin decimalrepræsentation spilde 28 tal, da man sandsynligvis ville begrænse sig til maksimalt (511,99) i praksis.
I stedet for en direkte fortolkning af fast-komma-værdien som en vektor af 2 separate heltal - hvilket næsten altid betyder et ubenyttet dataområde ved konvertering til decimaler og en manuel overførsel - kan decimalområdet i stedet fortolkes som brøk af deres samlede opløsning.
Med eksemplet på den lige nævnte ufixed(9,7)
resulterer dette i en brøk med en nævner på 27 - talområdet går så fra 0,00 til 511 + 126⁄127
Til konvertering til en decimalrepræsentation skal decimalen derfor deles med 128.
Med denne variant kan beregningsoperationer udføres lettere, da overførslen sker automatisk, hvilket gør denne variant i de fleste tilfælde foretrukket.
Denne variant har dog den ulempe, at decimalerne i decimalrepræsentationen ikke længere har en garanteret opløsning, så en enkelt decimal ikke længere svarer til værdien 0.01
, men 0.007874
, hvilket vil føre til tilsvarende afrundingsfejl.
Hvilken fortolkningsmetode der anvendes, dokumenteres passende ved anvendelsesstedet.
Flydende- eller glidende komma-værdier
Flydende komma-værdier er matematiske komplekse udtryk, hvor et helt tal med fast opløsning udtrykkes gennem et matematisk udtryk, så den effektive decimaldel dannes ved forskydning - og dermed er direkte relateret til videnskabelig notation.
Den mest almindelige måde at implementere dette på er standardiseret med
IEEE 754 og er blevet internationalt anerkendt siden da.
En flydende komma-værdi består typisk af følgende komponenter:
Fortegn (0 eller 1 ) |
Eksponent | Mantisse |
Mens fortegnet som binær ja/nej-information kan udledes enkelt, dannes det egentlige tal gennem ligningen
Mantisse * 2Eksponent
Derudover findes der en række konstante værdier, der dækker særlige tilfælde af rationelle tal - herunder ±∞
og NaN
("ikke et gyldigt tal").
Flydende komma-værdier er især nyttige, når nøjagtigheden ikke er så vigtig, da denne type værdier nødvendigvis fører til afrundingsfejl og dermed tab af nøjagtighed. Typisk anvendes flydende komma-værdier derfor f.eks. til at definere koordinater, såsom vertex-vektorer i 3D-modeller eller Bézier-/Spline-kurver til optiske repræsentationsformål.
I dataformater specificeres flydende komma-værdier som float(Mantisse, Eksponent)
.
Hvis et format, der afviger fra IEEE 754, anvendes, angives dette tilsvarende.