
Egy eszköz nyolc bitet küld, a fogadó rendszer 255-öt mutat, a dokumentáció szerint mégis mínusz egynek kellene lennie. A nyolc bit önmagában nem mondja meg, hogy előjeles vagy előjel nélküli értékről van szó. A mező jelentése az adatkapcsolat szerződéséhez tartozik.
Ebben a cikkben kizárólag a nyolcbites, kettes komplemensű előjeles egész ábrázolást hasonlítjuk az előjel nélkülihez. Más kódolás vagy szövegmező esetén eltérő értelmezés szükséges.
Nyolc bitből 256 különböző minta
Minden bit kétféle értéket vehet fel, így nyolc biten 2⁸ = 256 bitminta lehetséges. Előjel nélkül ezek a 0-tól 255-ig terjedő egész számokat jelölik. A tartomány mindkét végpontja beleszámít: 255 − 0 + 1 = 256.
Kettes komplemensű előjeles értelmezésben a tartomány −128-tól 127-ig tart. Ez is 256 érték, mert 127 − (−128) + 1 = 256. A nulla a nemnegatív tartományhoz tartozik, ezért a legkisebb negatív szám abszolút értéke eggyel nagyobb a legnagyobb pozitívnál.
Az MDN DataView getInt8 dokumentációja például egy bájt előjeles olvasását és ezt a tartományt írja le. A getUint8 dokumentációja ugyanazon méret előjel nélküli olvasását tárgyalja. A két művelet külön értelmezést rendelhet ugyanahhoz a bájthoz.
Átváltás az előjel nélküli értékből
Legyen u a nyolc bit 0 és 255 közötti előjel nélküli értéke. Kettes komplemensű előjeles értelmezése:
- Ha u kisebb 128-nál, az előjeles érték is u.
- Ha u legalább 128, az előjeles érték u − 256.
A 11111111 bitminta előjel nélkül 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255. Előjelesen 255 − 256 = −1. A 10000000 minta előjel nélkül 128, előjelesen 128 − 256 = −128.
A 01111111 értéke mindkét vizsgált értelmezésben 127. Ezért az alacsony pozitív tesztadatok önmagukban nem mutatják ki a rosszul választott mezőtípust. Olyan próbák is kellenek, amelyeknél a legfelső bit egy.
Egy konkrét negatív mérési érték
A −10 érték nyolcbites kettes komplemensű tárolásához a megfelelő előjel nélküli szám 256 − 10 = 246. Bináris alakja 11110110. Visszaolvasva 246 − 256 = −10.
Ha egy feltételezett eszköz tizedfokos skálát használ, és a mező nyers előjeles értéke −10, a mérési érték −10 / 10 = −1,0 fok. Előjel nélküli hibás olvasással 246 / 10 = 24,6 fok látszana. A skálázás tehát csak a helyes nyers egész szám értelmezése után következhet.
A tizedfokos skála itt saját példa; valódi műszernél a dokumentáció mondja meg a váltószámot, az eltolást és az esetleges hibakódokat. Egyes bitminták hiányzó mérést is jelölhetnek, ezért az összes 256 minta nem feltétlenül használható mérési értékként.
Mi történik a tartomány végén?
A 127 még ábrázolható előjeles nyolcbites szám. A matematikai 127 + 1 = 128 már kívül esik ezen a tartományon. Egy rögzített nyolcbites, körbeforduló tárolási modellben a keletkező 10000000 minta −128-ként értelmeződik.
Ezt a viselkedést nem lehet minden programnyelvre és műveletre általánosítani. A környezet hibát jelezhet, szélesebb típust használhat vagy más szabály szerint alakíthatja át az értéket. A bemeneti tartomány ellenőrzése ezért megelőzze a tárolást. A negatív érték abszolút értékével is figyelni kell: a 128 nem fér az előjeles nyolcbites pozitív tartományba.
Az adatmennyiség-átváltó a bit és bájt kapcsolatának ellenőrzéséhez ad általános segítséget. Egy bájt itt nyolc bitet jelent; a bájtok szövegként történő dekódolása külön kérdés, ezért egy karakterátváltó eredménye nem helyettesíti az egészszámmező értelmezését.
Milyen adatot kérj az eszköz mellé?
A mezőleírás tartalmazza a bitszámot, az előjelet, az egészszám-kódolást, a skálát és a különleges hibajelzéseket. Többbájtos mezőnél a bájtsorrendet is tisztázni kell. A próbafájlba kerüljön nulla, legnagyobb pozitív, mínusz egy és legkisebb negatív érték, hogy a határok is ellenőrizhetők legyenek.
Tudáspróba
1. Mennyi a 255 előjel nélküli érték nyolcbites kettes komplemensű értelmezése?
- A: 255.
- B: −255.
- C: −1.
2. Melyik az előjeles nyolcbites kettes komplemensű tartomány?
- A: −128 és 127 között.
- B: −255 és 255 között.
- C: 0 és 255 között.
3. Mennyi a 246 nyers bájt értéke előjeles olvasás és tízzel osztás után?
- A: 24,6.
- B: −1,0.
- C: −24,6.
Megoldások és következő lépés
1. C. 255 − 256 = −1, mert a legfelső bit egy.
2. A. A 256 lehetséges minta −128-tól 127-ig jelöl egész számokat.
3. B. Előbb 246 − 256 = −10, majd −10 / 10 = −1,0 következik.
0–1 pont: számold végig a 127, 128 és 255 értékeket a kétágú szabállyal. 2 pont: ellenőrizd a −10 oda-vissza átváltását. 3 pont: saját eszközöd mezőleírásából készíts határértékeket is tartalmazó próbasort, és a skálázást csak a helyes típusolvasás után végezd.


