Kezdőoldal » Számítástechnika » Programozás » C++ -ban miért ír 373-at?

C++ -ban miért ír 373-at?

Figyelt kérdés

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?


2016. jún. 21. 17:37
1 2
 11/17 A kérdező kommentje:

Végignézem ezt a videót, aztán csöndbe maradok:


https://www.youtube.com/watch?v=Rub-JsjMhWY

2016. jún. 21. 18:28
 12/17 anonim ***** válasza:
2^32-5356778 = 4289610518
2016. jún. 21. 19:30
Hasznos számodra ez a válasz?
 13/17 anonim ***** válasza:
69%

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.

2016. jún. 21. 19:48
Hasznos számodra ez a válasz?
 14/17 anonim ***** válasza:
56%

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

2016. jún. 21. 19:58
Hasznos számodra ez a válasz?
 15/17 A kérdező kommentje:
Nagyon szépen köszönöm, nem gondoltam volna, hogy ilyen érthető és terjedelmes választ kapok. :)
2016. jún. 21. 21:05
 16/17 anonim ***** válasza:
45%
Gyorsabb volt leírni, mint veled vitázni. Így legalább a következő kérdésedig (amit már előtted százezren feltettek, csak te lusta vagy rákeresni) eltűnsz.
2016. jún. 21. 23:06
Hasznos számodra ez a válasz?
 17/17 A kérdező kommentje:
Velem nem kell vitázni. Aki nem akar válaszolni, annak nem kell.
2016. jún. 22. 00:30
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!