Kezdőoldal » Számítástechnika » Programozás » Lehet használni 1 bytos...

Lehet használni 1 bytos integert c++-ban? A char ha jól tudom így funkcionál, de használható minden tekintetben egész számként, azaz az aritmetikai műveletek érvényesek rá?

Figyelt kérdés

2012. szept. 1. 07:13
 1/9 A kérdező kommentje:
Illetve az aritmetikai műveletek nem automatikus cast-olást jelentenek? Azaz lényegében nem 1 bytos számokat ad össze a gép, hanem minimum short int-eket, azaz lassabb lesz a művelet?
2012. szept. 1. 07:14
 2/9 iostream ***** válasza:
A char lassabb, mint a short int. Másfelől erre vannak szabályok: mindig arra kasztolódik fel a műveletben a két operandus, amiben elfér mindkét operandus. Tehát ha összeadsz egy chart meg egy intet, akkor a charból int lesz, és úgy adódik össze. Ha összeadsz egy intet meg egy floatot, akkor float lesz az intből. Ha összeadsz egy unsigned chart meg egy signed chart, akkor unsigned lesz mindkettő, és úgy adódnak össze.
2012. szept. 1. 09:53
Hasznos számodra ez a válasz?
 3/9 A kérdező kommentje:

nekem 1 bytos integer kéne!

azaz char+char a kérdés!

2012. szept. 1. 10:00
 4/9 iostream ***** válasza:

Idézem magam: "Másfelől erre vannak szabályok: mindig arra kasztolódik fel a műveletben a két operandus, amiben elfér mindkét operandus."


Szerinted ha két chart akarsz összeadni, akkor mi az az adattípus, amiben elfér egy char és egy char is? Na? Csak nem a char?

2012. szept. 1. 10:22
Hasznos számodra ez a válasz?
 5/9 anonim ***** válasza:

"használható minden tekintetben egész számként, azaz az aritmetikai műveletek érvényesek rá?"

Igen.


"A char lassabb, mint a short int."

Csak sima józan paraszti ésszel a char a gyorsabb mert kisebb, de gyakorlatba meg architektúra függő lehet.


Csak kíváncsiságból csináltam rá egy egyszerű tesztet. Persze a sebesség összehasonlításánál az sem mindegy hogy milyen aritmetikai műveleteket hasonlítunk össze. Nem bonyolítottam túl én a += operátor által elvégzett aritmetikai műveletet választottam. Persze a tesztet befolyásolta a háttérbe futó processzek, mivel multitask-os rendszert használok, de nagyságrendileg nem folyásolta be csak bizonyos %-ig. Ezért 3 változatból 3-3 tesztet csináltam.


short int.cpp:

int main(){

short int a=10,b=20;

for (unsigned int i=0;i<100000000;i++){

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

}

return 0;

}


char.cpp:

int main(){

short int a=10,b=20;

for (unsigned int i=0;i<100000000;i++){

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

a+=b;

}

return 0;

}


uresciklus.cpp:

int main(){

for (unsigned int i=0;i<100000000;i++){

}

return 0;

}


a+=b;-ből azért írtam olyan sokat mert különben az idő nagy része a ciklusváltozó növelésével illetve a ciklusmagba való belépés ellenőrzésével telt el.


Íme a teszt eredménye:


----------------------------

ures ciklus:


real 0m0.343s

user 0m0.340s

sys 0m0.000s

----------------------------

ures ciklus:


real 0m0.342s

user 0m0.340s

sys 0m0.000s

----------------------------

ures ciklus:


real 0m0.339s

user 0m0.332s

sys 0m0.004s

----------------------------

char:


real 0m5.903s

user 0m5.892s

sys 0m0.000s

----------------------------

char:


real 0m5.921s

user 0m5.916s

sys 0m0.000s

----------------------------

char:


real 0m5.822s

user 0m5.808s

sys 0m0.004s

----------------------------

short int:


real 0m5.903s

user 0m5.892s

sys 0m0.000s

----------------------------

short int:


real 0m5.899s

user 0m5.888s

sys 0m0.000s

----------------------------

short int:


real 0m5.920s

user 0m5.908s

sys 0m0.000s



Nem látom azt hogy az egyik gyorsabb lenne mint a másik, de az meg szembetűnő hogy az üres ciklus gyorsabb.

2012. szept. 1. 15:36
Hasznos számodra ez a válasz?
 6/9 anonim ***** válasza:
Ja és egyébként egymillió helyett százmillió van, csak az oldal tahó módon levágja a nullákat amit egyszer régen kiírtam gyk-ra hogy más tudja-e írni százmilliót és nem sikerült senkinek, "gratulálok" gyk, még tudnék panaszkodni az oldalra, de most ne menjünk bele.
2012. szept. 1. 15:43
Hasznos számodra ez a válasz?
 7/9 anonim ***** válasza:

De hülye vagyok mindkét helyre short int-et írtam.

Korrigáltam a hibát.

Akkor még is az lett amit sejtettem a char a gyorsabb:

----------------------------

ures ciklus:


real 0m0.341s

user 0m0.336s

sys 0m0.000s

----------------------------

ures ciklus:


real 0m0.340s

user 0m0.336s

sys 0m0.000s

----------------------------

ures ciklus:


real 0m0.340s

user 0m0.336s

sys 0m0.000s

----------------------------

char:


real 0m5.883s

user 0m5.872s

sys 0m0.000s

----------------------------

char:


real 0m5.897s

user 0m5.884s

sys 0m0.004s

----------------------------

char:


real 0m5.909s

user 0m5.904s

sys 0m0.000s

----------------------------

short int:


real 0m5.944s

user 0m5.936s

sys 0m0.000s

----------------------------

short int:


real 0m5.950s

user 0m5.940s

sys 0m0.000s

----------------------------

short int:


real 0m5.964s

user 0m5.956s

sys 0m0.000s

2012. szept. 1. 15:51
Hasznos számodra ez a válasz?
 8/9 anonim ***** válasza:
Az üres ciklust valószínűleg kioptimizálja a fordító, így le sem fut az a ciklus.
2012. szept. 1. 16:17
Hasznos számodra ez a válasz?
 9/9 anonim ***** válasza:
100%

"Az üres ciklust valószínűleg kioptimizálja a fordító, így le sem fut az a ciklus."

Ez nem igaz, a ciklusváltozót 5x-ösére átírtam így a futási idő:

"

real 0m1.721s

user 0m1.712s

sys 0m0.004s

"

Ha kiveszem az üres ciklust akkor:

"

real 0m0.002s

user 0m0.000s

sys 0m0.000s

"

Ez csupán az üres program futási ideje vagyis a processz inicializáló meg deinicializáló rutin ennyi idő alatt fut le.

Ha az kód optimalizálást bekapcsolom (kipróbáltam) akkor az van amit te mondasz, de szándékosan nem így tettem.

2012. szept. 1. 17:41
Hasznos számodra ez a válasz?

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

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!