Porovnavanie hodnot – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Porovnavanie hodnot – C / C++ – Fórum – Programujte.comPorovnavanie hodnot – C / C++ – Fórum – Programujte.com

 

olgo0
Věrný člen
7. 6. 2007   #1
-
0
-

zdar. ma jednu otazocku, ktora sice moc nesuvisi prave s ceckom ale verim ze sem chodia najzdatnejsi programatori :)

predstavme si dve bajtove hodnoty (teda char alebo unsigned char) pricom jedna ma hodnotu povedzme 15 a druha 241. ked ich porovnam samozrejme ze dostanem 15<241.keby ale tych 241 bolo znamienkovych v skutocnosti je to 15>-15. otazka teda je ako sa rozlisuju typy bez a zo znamienkom pri typoch s rovnakou velkostou?
asi by som to mal ilustrovat na priklade



char a=15;
char b=241;

if(a<b){
/* v pripade ze b je neznamienkove (15<241) je tu true ak je znamienkove (15>-15) je tu false */
}

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
pepe
~ Anonymní uživatel
13 příspěvků
7. 6. 2007   #2
-
0
-

mno a nezalezi to na programatorovi, aby si to pohlidal?
a visual studio hlasi warning pri kompilaci pri porovnavani signed a unsigned...

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
7. 6. 2007   #3
-
0
-
Nahlásit jako SPAM
IP: ...–
olgo0
Věrný člen
7. 6. 2007   #4
-
0
-

To Jura: no moc mudri s toho niesom ale diky za link. nastastie vdaka mojej averzii voci zapornym cislam sa s tymto problemom asi casto nestretnem. thx

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
Jan Bednařík0
Super člen
8. 6. 2007   #5
-
0
-

olgo píše:#
# zdar. ma jednu otazocku, ktora sice moc nesuvisi prave s ceckom ale verim ze sem chodia najzdatnejsi programatori :)#
##
#predstavme si dve bajtove hodnoty (teda char alebo unsigned char) pricom jedna ma hodnotu povedzme 15 a druha 241. ked ich porovnam samozrejme ze dostanem 15<241.keby ale tych 241 bolo znamienkovych v skutocnosti je to 15>-15. otazka teda je ako sa rozlisuju typy bez a zo znamienkom pri typoch s rovnakou velkostou?#
#asi by som to mal ilustrovat na priklade#
#

#
#char a=15;#
#char b=241;#
##
#if(a<b){#
# /* v pripade ze b je neznamienkove (15<241) je tu true ak je znamienkove (15>-15) je tu false */#
#}#
#



Rozlišují se slovíčkem signed/unsigned před typem proměnné. Zbytek už vyřeší kompilátor. Char je myslím vždy unsigned a nikdy nenabývá záparné hodnoty, viz. ASCII tabulka :-)

Nahlásit jako SPAM
IP: ...–
Python + Django + PostgeSQL = spokojený vývojář :-)
Jura
~ Anonymní uživatel
637 příspěvků
8. 6. 2007   #6
-
0
-

Sorry, olgo, ja si to neprecetl cele. Pokud porovnavas char, tak se implicitne pretypuji na int. Ted uz je to myslim jasne. Pokud neni, tak napis pokusim se to vysvetlit.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
8. 6. 2007   #7
-
0
-

To Architekt:
Char samozrejme muze nabyvat i zapornych hodnot.

Nahlásit jako SPAM
IP: ...–
olgo0
Věrný člen
8. 6. 2007   #8
-
0
-

To Jura: ano snad je to jasne.

To Architekt: nechcem sa hadat ale myslim ze je to iba pomenovanie a char je implicitne signed (aj ked to moze byt vecov kompilatoru).

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
Jan Bednařík0
Super člen
10. 6. 2007   #9
-
0
-

Mě to připadá jako blbost, že by char mohl nabývat záporných hodnot. Typ char je určen pro znaky z ASCII tabulky které jsou vždy kladné a proto je logické, že se u něj se zápornou hodnotou nepočítá. Tak jsem to vyzkoušel:

char a,b,c;

for (int i=-128; i<0; i++) {
a = i;
b = i + 128;
c = i + 256;
cout << i << ": " << a << " :" << sizeof(a) << " ";
cout << i + 128 << ": " << b << " :" << sizeof(b) << " ";
cout << i + 256 << ": " << c << " :" << sizeof(c) << "\n";
}

Pro char o hodnotách -128 až -1 vypíše znaky odpovídající hodnotám 128 až 255. Když jsem definoval a,b,c jako signed i unsigned, vždy byl výsledek stejný a vždy byl sizeof roven 1B. Tj. kompilátor (GNU GCC) signed/unsigned ignoroval a vše bral jako unsigned.

Nahlásit jako SPAM
IP: ...–
Python + Django + PostgeSQL = spokojený vývojář :-)
Jura
~ Anonymní uživatel
637 příspěvků
10. 6. 2007   #10
-
0
-

To Architekt:
Blbost je to testovat tak, jak jsi to naspal ty. Cout je neformatovaný výstup a pokud jeho agumet typu char, je přetypován na unsigned char, tedy tak aby z toho byl znak(v počítači jsou všechno jen čísla a C se na to taky tak dívá, proto v C můžeš narvat do charu i číslo. Takový "luxus" si v Pascalu dovolit nemůžeš).

Nahlásit jako SPAM
IP: ...–
Jan Bednařík0
Super člen
10. 6. 2007   #11
-
0
-
Nahlásit jako SPAM
IP: ...–
Python + Django + PostgeSQL = spokojený vývojář :-)
Jura
~ Anonymní uživatel
637 příspěvků
10. 6. 2007   #12
-
0
-

To Architekt:
Jako důkaz ti může být třeba Olgův problém.



char a = -15; // podle tvé úvahy se a = 241; -> vše je unsigned
char b = 15;
// porovná se normálně (int)a < (int)b, tudíž -15 < 15 a podmínka platí.
//Kdyby byl char v C jen unsigned, tak by se porovnavalo 241 < 15, pominka neplatí, tudíž se provede větev else
if( a < b )
printf("a je mensi nez b");
else
printf("neni");


Nahlásit jako SPAM
IP: ...–
olgo0
Věrný člen
10. 6. 2007   #13
-
0
-

To Architekt: rudolf marek vo svojej knihe "assembler pro pc" to pekne zrozumitelne vysvetluje. "problem" je v tom ze (aspom u x86) v tom rozdiel neni a je to len otazka vypisu tzn kludne mozes unsigned char vypisat ako char a moze mat kldne hodnotu vyssiu ako 127 navzdory tomu ze takato hodnota by sa do ucharu nemala zmestit a teda pokusat sa to overit je blbost. co sa tyka rozdielou znamienkovych a neznamienkovch typov su tam preto aby prekladac poznal ci ma pouzit obycajnu instrukciu alebo instrukciu pracujucu zo zapornymi cislami (v pokrocilejsej aritmetike napriklad).

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 105 hostů

Podobná vlákna

Porovnavanie datumov — založil Milan

Porovnávanie reťazcov — založil Kent

Porovnavanie čísel — založil Plui

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý