C++ -ban miért ír 373-at?
Ezt írtam be:
int num = 0565;
cout<<num<<endl;
Futtatáskor 373m-at írt ki. Nyilván azért nem 565-öt, mert előtte van a nulla. De mégis, mi az oka, hogy 373-at ír ki? Mármint miért nem mondjuk 379-et? Miért pont ezt az értéket számolja ki? Mit végez el a háttérben, ami ezt a végeredményt adja ki?
0565 az azért 373, mert:
Oktális azaz 8-as számrendbeli számokat 0-val kezdjük.
Baloldali (8) míg az egyenlőség jobb oldala (10)-es számrendszer.
01 = 1
07 = 7
010 = 8
0565 = 373
5*8^2 + 5*8^1 + 5*8^0 = 373
Van olyan, hogy (16)-os számrendszer. Azt 0x-el kezdjük.
0x10 = 1*16^1 + 0*16^0
Illetve itt már vannak betűk: A=10; B=11; ...; F=15.
Tehát: 0x1D = 1*16^1 + 13*16^0 = 16+13 = 29 (10)-es számrendszerben
--- --- --- --- --- ---
11111111101011100100001100010110 ez egyenlő!!!
Ezzel: -5356778
És ezzel is: 4289610518
Miért is? Mert UNSIGNED esetén az első! bit esetén NEM negatív jelző.
Ha SIGNED (vagy nem írod ki) akkor az első bit NEGATÍV JELZŐ.
Tehát példa byte/char esetén (nem int, de lényeg ugyanaz):
BE = 1011 1110 = -66 vagy 190
Ha ezt így beütöd számológépbe, akkor 190 kapsz. De hogy kapsz -66-ból ugyanazt? Így:
-66-nak vesszük az abszolút értékét: 66
66 / 2 = 33 maradék 0
33 / 2 = 16 maradék 1
16 / 2 = 8 maradék 0
8 / 2 = 4 maradék 0
4 / 2 = 2 maradék 0
2 / 2 = 1 maradék 0
1 / 2 = 0 maradék 1
Maradékokat lentről felfele olvasva: 1000010 az elején kiegészítjük 1db 0-val mert byte-ről beszélünk és az 8 karakteres. Így: 0100 0010. Ha ezt számológépbe ütöd az 66 lesz. De nekünk -66 kell.
01000010 ennek az ellentétét veszed. 0-ból 1-est és 1-esből 0-t kell venni majd ehhez 1et adni.
1011 1101 + 1 = 1011 1110
Tehát ugyanazt kaptuk mint legelőször írtam BE = ...-ra.
Ezért számít az, hogy jelölt (signed) vagy jelöletlen számról van-e szó, mert a jelölt esetén az első bit dönt arról, hogy a szám lehet-e negatív.
C vagy C++ban:
char unsigned i = -66; // kiíratásra 190 lesz
char i = -66; // kiíratásra -66 lesz
byte = char!!, de ez igaz nagyobb számokra is, csak byte-tot választottam, hogy lássad.
elírtam ezt:
5*8^2 + 5*8^1 + 5*8^0 = 373
Hiba: 0565 helyett 0555 szerint írtam az egyenlőség baloldalát.
helyette ez:
5*8^2 + 6*8^1 + 5*8^0 = 373
További kérdések:
Minden jog fenntartva © 2025, 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!