C/C++: Válaszolnátok erre a kisebb "jól értem-e" kérdésözönre? Adatok tárolása, bináris ábrázolás
Tehát, az alábbiakban sorszámozva összeállítom hogy mik a kérdőjeles részek és az érdekelne hogy jól értem-e vagy nem.
1. Legyen
signed int a;
változó. A futó alkalmazáshoz kapcsolt adatterületen létezik ez a változó 2 bájton, címe &a. Az
a = KONSTANS; // KONSTANS nyilván decimális érték
értékadás hatására az alkalmazás (vagy oprendszer?) a KONSTANS-t átalakítja kettes számrendszerbeli számmá, kettes komplemenst képez és a &a területen ez az érték tárolódik el. Ezért, előjeles értékeket is eltárolhatunk. Ha lekérdezzük az "a" változó értékét, akkor az &a területről kettes komplemensképzéssel kapom meg a KONSTANS értéket.
2. Legyen most
unsigned int a;
változó. A fentiek abban módosulnak hogy a bináris tárolás komplemensképzés nélkül megy végbe hiszen a változó csak pozitív értékek tárolására van, így fölösleges a negáció.
3. A fentiek szépek de a C/C++ nyelv nem ilyen egzakt módon kezeli az adatokat. Mi a helyzet alacsonyabb "nyelvekkel" pl Assembly, gépi kód, ott így történik az adatábrázolás?
Nagyon hálás lennék ha válaszolnátok erre a pár kérdésemre. Üdv
"A futó alkalmazáshoz kapcsolt adatterületen létezik ez a változó 2 bájton, címe &a."
Általában 4 byte, régen volt jellemző a 2 byte. A méretről a sizeof operátor tudna "mesélni". Amit a szabvány előír : sizeof(short) <= sizeof(int) <= sizeof(long), nem írja elő a szabvány a pontos méretet hogy minél hatékonyabb kódot tudjon generálni a c/c++ fordító adott hardverhez.
----------------------------
"a = KONSTANS; // KONSTANS nyilván decimális érték
értékadás hatására az alkalmazás (vagy oprendszer?) a KONSTANS-t átalakítja kettes számrendszerbeli számmá, kettes komplemenst képez és a &a területen ez az érték tárolódik el. Ezért, előjeles értékeket is eltárolhatunk. Ha lekérdezzük az "a" változó értékét, akkor az &a területről kettes komplemensképzéssel kapom meg a KONSTANS értéket."
A decimális érték átalakítása kettes számrendszerbeli számmá még fordítási időbe történik.
----------------------------
"2. Legyen most
unsigned int a;
változó. A fentiek abban módosulnak hogy a bináris tárolás komplemensképzés nélkül megy végbe hiszen a változó csak pozitív értékek tárolására van, így fölösleges a negáció."
Valójába ugyanúgy történik,( a programba "be van égetve"), attól még írhatom hogy a= -1, ekkor a legnagyobb unsigned int-et kapom, vagy fordítva int helyébe beírhatom a legnagyobb undigned int értékét akkor -1-et kapok.
--------------------------------
"3. A fentiek szépek de a C/C++ nyelv nem ilyen egzakt módon kezeli az adatokat."
Akkor nem értem mit állítasz.
Assembly-be pontosan meghatározott, nem fordító függő hogy hány byte-os számok vannak, nagyon hardver és OS függő a kód. Ott látszik hogy valójába nincs unsigned int és signed int hanem valójába nem előjeles vagy nem egy szám hanem attól függ hogy hogyan tekintem, összeadásra, kivonásra ugyan az a gépi kódú utasítás van attól független hogy előjeles számról van e szó hiszen ugyanaz a bitkép keletkezik, úgy van megalkotva, de a szorzásra külön van előjeles meg előjel nélküli szorzás mint gépi kódú utasítás, mert akkor különböző bitkép jellemzi a szorzás eredményét attól függően hogy előjeles vagy nem számokról van e szó.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!