Vad är vad? · bei.pm
I den här sektionen finns det artiklar om filformat och reverse engineering.
Men så är det:
Det finns många programmeringsspråk där ute och många människor som känner till vissa saker under helt andra namn - eller som inte har någon aning om existensen av de mest grundläggande sakerna eftersom deras programmeringsspråk abstraherar bort dem.
tl;dr:
Min notation är grovt baserad på C99 <stdint.h>
. Den som kan förstå denna notation kommer säkerligen att klara av min notation.
Heltal
Heltal är helt enkelt heltal, det vill säga siffror utan decimaldel.
Heltal definieras i datatyper oftast inom ett fast talområde, nästan som en upplösning. Jag anger detta i bitar - eftersom en "byte" och därpå följande typer (ord, qword, ...) oftast är plattformsberoende.
Det finns också en skillnad mellan naturliga tal (ℕ, det vill säga utan tecken - Unsigned) och hela tal (ℤ, det vill säga med tecken - Signed).
Denna information framgår av ett tecken i beteckningen (u
eller s
).
Det är möjligt att tecknade heltal antingen representeras som enkomplement eller som tvåkomplement.
Och så länge inget annat anges används tvåkomplement, eftersom det är den föredragna representationen inom modern datavetenskap.
Tecknade tal anges av mig i mina dokumentationer som sint
, även med efterföljande angivelse av noggrannhet i bitar.
Jag avstår från att använda datatypen "char" för tecken, eftersom strängar vanligtvis bara representerar kedjor av heltalsvärden med en speciell tolkning.
Därför representeras de som uint(8)[].
Exempel:
Notation | C99 stdint.h -motsvarighet |
Beskrivning | Talområde |
---|---|---|---|
uint(16) | uint16_t | Osignerad heltal, 16 bitars längd | 0 - 65.535 |
sint(8) | int8_t | Signerad heltal, 8 bitars längd, tvåkomplement | -126 - 127 |
uint(24) | uint32_t:24 | Osignerad heltal, 24 bitars längd | 0 - 16.777.216 |
Festkomma-värden
Fastpunktstal är numeriska värden från spektrumet av rationella tal (Q), som därmed har ett komma samt decimaler.
Med fastpunktstal är - därav namnet - positionen för kommat fastställd av datatypen.
Därför finns det också ett fast nummerområde för tal av denna datatyp; matematiskt uttryckt är talområdet ändligt.
I praktiken används denna datatyp främst på plattformar utan tillräckligt snabb flyttals-hårdvaruenhet, eftersom beräkningen av fastpunktstal kan göras av heltalsenheter.
Datatypen används också till exempel av databas-hanteringssystem när fastställda krav måste uppfyllas.
Tänk här på system för permanent lagring av finansiella data; de flesta valutor begränsar sig till 2 decimaler.
(Det är dock inte klokt att använda fastpunktstal för detta; det är smartare att istället direkt spara minsta valutaenhet som heltal och lämna resten av presentationsnivån.)
Analogt med heltalsangivelser anger jag för fastpunktstal upplösningen av talet före och efter kommat:
ufixed(9,7)
betecknar en datatyp som reserverar 9 bitar för värdet före kommat samt 7 bitar för värdet efter kommat; totalt alltså 16 bitar bred och kan så som exempelvis en vektor av två oberoende heltal täcka ett område från (0,0) till (511,127).
Denna tolkning skulle dock i sin decimalrepresentation lämna 28 tal oanvända, eftersom man sannolikt skulle begränsa sig till högst (511,99) i praktiken.
I stället för en direkt tolkning av fastpunktstalet som en vektor av 2 separata heltal - vilket nästan alltid innebär ett oanvänt dat område vid omvandling till decimaler och en manuell överföring - kan decimaldelen istället tolkas som en bråkdel av hela upplösningen.
I exemplet med det ovan nämnda ufixed(9,7)
blir det således ett bråk med en nämnare på 27 - talområdet går då från 0,00 till 511 + 126⁄127.
För att omvandla till en decimalrepresentation skulle decimaldelen därför delas med 128.
Med denna variant kan enklare beräkningsoperationer utföras, eftersom överföringen sker automatiskt, vilket gör att denna variant vanligtvis föredras.
Denna variant har dock nackdelen att decimalerna i decimalrepresentationen inte längre har en garanterad upplösning, så en enskild decimalplats har inte längre värdet 0.01
, utan 0.007874
, vilket leder till motsvarande avrundningsfel.
Vilken tolkning som används dokumenteras på lämplig plats.
Flyttals- eller glidande talvärden
Flyttal är matematiskt mer komplexa uttryck där ett heltal med fast precision uttrycks genom ett matematiskt uttryck på ett sätt som effektivt bildar decimaldelen genom förskjutning - och därmed direkt relaterar till vetenskaplig notation.
Det vanligaste sättet att genomföra detta har standardiserats med
IEEE 754 och har sedan dess blivit internationellt erkänt.
En flyttal består vanligtvis av följande komponenter:
Tecken (0 eller 1 ) |
Exponent | Mantissa |
Medan tecknet kan härledas enkelt som en binär ja/nej-information, bildas det faktiska talet genom ekvationen
Mantissa * 2Exponent
Det finns dessutom en rad konstanta värden som täcker särskilda fall av rationella tal - inklusive ±∞
och NaN
("ingen giltig siffra").
Flyttal är särskilt användbara när noggrannhet inte är så viktig, eftersom det vid denna typ av värden oundvikligen uppstår avrundningsfel och därmed förlust av noggrannhet. Oftast används flyttal till exempel för att definiera koordinater, såsom vertexvektorer i 3D-modeller eller Bézier-/Spline-kurvor för optiska representationsändamål.
I dataformat specificeras flyttal som float(Mantissa, Exponent)
.
Om ett format som avviker från IEEE 754 används, kommer detta att anges på lämpligt sätt.