Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako proveriti da li je char signed ili unsigned

[es] :: C/C++ programiranje :: Kako proveriti da li je char signed ili unsigned

[ Pregleda: 5918 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

alfa-pro
Pancevo

Član broj: 241818
Poruke: 476
*.dynamic.sbb.rs.



+7 Profil

icon Kako proveriti da li je char signed ili unsigned23.12.2014. u 19:00 - pre 120 meseci
Drustvo imam mali problem oko testiranja char tipa. Po normali char moze da sadrzi karaktere od 0 do 255.
Da bi se drzao ASCII standarda char type mora biti signed jer ASCII standard limitira 0 do 127 (-128 do 127).

Negde sam procitao da po default-u char je uvek signed sto meni odgovara. Na stackoverlow-u sam video odgovor da ne mora da znaci da je uvek signed sve zavisi od okruzenja.
Koristim VS 2013 u njihovoj compile dokumentaciji nisam nasao da se ovo pominje.

Pored ovoga imam nedoumicu u vezi ova tri tipa za char, signed char i unsigned char.
Do sada sam koristio char za tekstove i sve zivo. Da li bi neki moj program krsio standard ako koristim char za sve jer ipak on ide van ASCII standarda jer sadrzi 255. Mozda gresim ali zato postavljam ovu temu da mi neko pojasni ovaj deo.

Kad je preporucljivo koristiti unsigned char a kad samo char i kada samo signed char?

Par puta mi je palo na pamet da ASCII moze sadrzati 255 karaktera ali samo ako je unsigned jer unsigned prima 2x veci broj od signed.


Nemam pojma zapetljao sam se ovde i bicu vam zahvalan ako uspete da mi pomognete da resim ovu zavrzlamu u glavi.
Kada vidjamo uvek ista lica, na kraju ona postaju deo našeg života. A kada postanu
deo našeg života,
onda žele i da nam ga izmene. I ako ne bude po njihovom, nije im pravo. Jer, svaki
čovek ima tačnu predstavu kako bi trebalo da živimo svoj život. A nikad nemaju pojma
kako treba da prožive sopstveni život.
 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: Kako proveriti da li je char signed ili unsigned23.12.2014. u 19:13 - pre 120 meseci
ASCII kod je orginalno implementiran sa 7 bitova sa kojima može da se kodira 128 različitih vrednosti (0...127).

Tip char je na danasnjim mašinama mahom 8-bitni, te može da predstavi duplo više različitih vrednosti od orginalnog ASCII raspona.
Međutim, i signed char (-128...127) i unsigned char (0...255) obuhvataju brojčane vrednsoti orginalnog ASCII (0...127) tako da
teoretski nema veze da li koristiš signed char ili unsigned char, sve dok u njega smještaš orginalne ASCII znakove.

Čak šta više, i sva uobičajena proširenja orginalnog ASCII koda dodatnim skupom znakova su izvedena tako da se u opsegu 0...127
nalaze orginalni ASCII znakovi, a dodatni znakovi su predstavljeni vrednostima 128...255, tako da i te proširene ASCII kodove možeš
da koristiš bez ikakvih izmjena u odnosu na orginalni ASCII kod, ako se držiš njegovih granica.
 
Odgovor na temu

alfa-pro
Pancevo

Član broj: 241818
Poruke: 476
*.dynamic.sbb.rs.



+7 Profil

icon Re: Kako proveriti da li je char signed ili unsigned23.12.2014. u 19:19 - pre 120 meseci
Cek znaci za svoje opste potrebe normalnih podrzanih znakova ja mogu koristiti signed sto je sasvim dovoljno
Kada vidjamo uvek ista lica, na kraju ona postaju deo našeg života. A kada postanu
deo našeg života,
onda žele i da nam ga izmene. I ako ne bude po njihovom, nije im pravo. Jer, svaki
čovek ima tačnu predstavu kako bi trebalo da živimo svoj život. A nikad nemaju pojma
kako treba da prožive sopstveni život.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
..ppoe.dyn.broadband.blic.net.



+62 Profil

icon Re: Kako proveriti da li je char signed ili unsigned25.12.2014. u 10:56 - pre 120 meseci
Koristi char, koji je podrazumevano unsigned.

Ruski karakteri, recimo, su iznad vrednosti 127. Ako imas (unsigned, znaci uvek pozitivan) kod karaktera i odgovarajuci Charset kod, mozes dobiti render(ispis) bilo kog karaktera nekog alphabet-a.

Pozz
 
Odgovor na temu

alfa-pro
Pancevo

Član broj: 241818
Poruke: 476
*.dynamic.sbb.rs.



+7 Profil

icon Re: Kako proveriti da li je char signed ili unsigned26.12.2014. u 08:02 - pre 120 meseci
Rajko char i ostali tipovi su by default SIGNED.

Koliko znam ako stavim samo char bez (signed i unsigned) on je po default-u signed i ide od –128 to 127. Jedino ako je unsigned ide do 255. Ispravite me ako gresim
Kada vidjamo uvek ista lica, na kraju ona postaju deo našeg života. A kada postanu
deo našeg života,
onda žele i da nam ga izmene. I ako ne bude po njihovom, nije im pravo. Jer, svaki
čovek ima tačnu predstavu kako bi trebalo da živimo svoj život. A nikad nemaju pojma
kako treba da prožive sopstveni život.
 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: Kako proveriti da li je char signed ili unsigned26.12.2014. u 14:20 - pre 120 meseci
C/C++ standard ne definiše da li je char po defaultu signed ili unsigned.
To zavisi od kompajlera do kompajlera. Čak ne definiše ni da je obavezno 8 bitova velik - već samo to da je "big enough to hold numeric values corresponding to the characters in the machine's basic character set".
Obično jeste 8 bitova, ali može i nešto drugo, ako je mašina "neobična".

Dakle, standard kaže da postoje tri različita tipa:

char
signed char
unsigned char


međutim, postoje samo dvije moguće reprezentacije:

signed char
unsigned char


Koja od ove dvije reprezentacije će biti korišćenja za "goli" char, zavisi od kompajlera.

Izvor ovih akrobacija u C/C++ je težnja da se jezik [po potrebi] može približiti hardveru što više.
Međutim, kada to nije potrebno, pametnije je da programer ne čeprka oko tih specifičnosti, tako što
će sam sebi ograničiti upotrebu tipova na isključivo one koje konceptualno odgovaraju onome za šta
ih upotrebljava, npr.:

- Ne koristi goli char u aritmetičkim operacijama. Koristi char samo za znakove. (Jer na jednoj mašini char može biti po defaultu signed, a na drugod unisigned, pa ti program neće raditi na drugoj mašini). Po defaultu (mislim bar), u aritmetičkim izrazima u kojima se miješaju signed i unsigned varijable dolazi do automatske konverzije tipova iz signed u unsigned i onda obično nastaje kuršlus.

- Ako ti treba mali integer, koristi eksplicitno signed ili unsigned char.


 
Odgovor na temu

alfa-pro
Pancevo

Član broj: 241818
Poruke: 476
*.dynamic.sbb.rs.



+7 Profil

icon Re: Kako proveriti da li je char signed ili unsigned27.12.2014. u 14:37 - pre 120 meseci
Znaci to je mene bunilo do sada, na nekim masinama kazu da je velicina 1 bajt a negde drugacije. To je znaci bilo sve do kompajlera.
Kada vidjamo uvek ista lica, na kraju ona postaju deo našeg života. A kada postanu
deo našeg života,
onda žele i da nam ga izmene. I ako ne bude po njihovom, nije im pravo. Jer, svaki
čovek ima tačnu predstavu kako bi trebalo da živimo svoj život. A nikad nemaju pojma
kako treba da prožive sopstveni život.
 
Odgovor na temu

djbocko

Član broj: 147833
Poruke: 15
*.adsl.eunet.rs.



+1 Profil

icon Re: Kako proveriti da li je char signed ili unsigned24.01.2015. u 14:42 - pre 119 meseci
Ja mislim da je 8-bitni unsigned (nebitno šta) od -127 do 127, signed od 0 do 256 i prilično sam siguran.
E sad, ako u C++ programiraš Atmel postoje write softveri, tj.kompileri u njima, koji se razlikuju, pogotovu ako u mkontrolerima programiraš karaktere za epprom. Jedno pišu drugo rade :-) Ja sam imao takve probleme.
Pozdrav.
Čega se pametan stidi, budala se ponosi.
 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: Kako proveriti da li je char signed ili unsigned24.01.2015. u 17:55 - pre 119 meseci
Citat:
djbocko: Ja mislim da je 8-bitni unsigned (nebitno šta) od -127 do 127, signed od 0 do 256 i prilično sam siguran.

Potpuno pogrešno, apsolutno sam siguran.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
..ppoe.dyn.broadband.blic.net.



+62 Profil

icon Re: Kako proveriti da li je char signed ili unsigned25.01.2015. u 10:53 - pre 119 meseci
Citat:
djbocko:
E sad, ako u C++ programiraš Atmel postoje write softveri, tj.kompileri u njima, koji se razlikuju, pogotovu ako u mkontrolerima programiraš karaktere za epprom.


?

Pozz
 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: Kako proveriti da li je char signed ili unsigned28.01.2015. u 02:53 - pre 119 meseci
Ostao sam dužan "dokaz".
Nije problem provjeriti kako je char implementiran na nekoj mašini.
Podaci o tome stoje u fajlu limits.h u vidu preprocesorskih konstanti
kao što su CHAR_MAX, CHAR_MIN, SCHAR_MAX itd.

Ovo je komad limits.h koji se nalazi u GCC kompajleru za moj PC:
Code:
 * Characteristics of the char data type.
 *
 * TODO: Is MB_LEN_MAX correct?
 */
#define CHAR_BIT    8
#define MB_LEN_MAX    2

#define SCHAR_MIN    (-128)
#define SCHAR_MAX    127

#define UCHAR_MAX    255

/* TODO: Is this safe? I think it might just be testing the preprocessor,
 *       not the compiler itself... */
#if    ('\x80' < 0)
#define CHAR_MIN    SCHAR_MIN
#define CHAR_MAX    SCHAR_MAX
#else
#define CHAR_MIN    0
#define CHAR_MAX    UCHAR_MAX
#endif

Da li će char biti singed ili unsigned zavisi od od toga da li je '\x80' (a što je inače 12810) manje od nula ili ne.
Na sličan način je i u VisualStudio-u:
Code:
#define CHAR_BIT      8         /* number of bits in a char */
#define SCHAR_MIN   (-128)      /* minimum signed char value */
#define SCHAR_MAX     127       /* maximum signed char value */
#define UCHAR_MAX     0xff      /* maximum unsigned char value */

#ifndef _CHAR_UNSIGNED
#define CHAR_MIN    SCHAR_MIN   /* mimimum char value */
#define CHAR_MAX    SCHAR_MAX   /* maximum char value */
#else
#define CHAR_MIN      0
#define CHAR_MAX    UCHAR_MAX
#endif  /* _CHAR_UNSIGNED */

Da li ovdje char signed ili unsigned zavisi od preprocesorske definicije _CHAR_UNSIGNED, a što je vjerovatno zakopano negdje
u project settings...

U svakom slučaju, najlakše je napisati programčić koji će ispisati vrednost granica iz fajla limit.h i "uživo" provjeriti:
Code:

#include <stdio.h>
#include <limits.h>

int main(void)
{
    printf("char\n");
    printf("Bits: %d\n", CHAR_BIT);
    printf("Max:  %d\n", CHAR_MAX);
    printf("Min:  %d\n", CHAR_MIN);

    printf("\nsigned char\n");
    printf("Max:  %d\n", SCHAR_MAX);
    printf("Min:  %d\n", SCHAR_MIN);

    printf("\nunsigned char\n");
    printf("Max:  %d\n", UCHAR_MAX);

    return 0;
}


Ovo je rezultat rada gornjeg programa na mojom mašini, GCC kompajler:



Znači, kod mene je char po defaultu signed.
Prikačeni fajlovi
 
Odgovor na temu

Predrag Supurovic
Pedja YT9TP
Užice

Član broj: 157129
Poruke: 6324

Sajt: pedja.supurovic.net


+1581 Profil

icon Re: Kako proveriti da li je char signed ili unsigned28.01.2015. u 09:26 - pre 119 meseci
> Kako proveriti da li je char signed ili unsigned

Promenljivoj tipa char dodelis binarnu vrednost 255 pa onda procitas tu vrednost i ako dobijes 255 onda je unsigned.
 
Odgovor na temu

mmix
Miljan Mitrović
Chief Software Architect
Financial Intelligence Software Ltd.
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6044



+4631 Profil

icon Re: Kako proveriti da li je char signed ili unsigned28.01.2015. u 09:50 - pre 119 meseci
Ja iskreno ne znam sta vas buni ovde. Za pure ASCII na PC platformi je potpuno nevazno da li je signed ili unsigned jer je 8-i bit (sign) uvek nula za ASCII vrednosti 0-127. Sve i da jeste, signed/unsigned su samo dve numericke reprezentacije iste 8-bitne vrednosti i oba mogu da drze 256 razlicitih vrednosti.

Ne postoji platforma na kojoj je char duzi od 1 "byte"-a, uprkos teorijskoj opsirnosti. To je vazilo pre nekih 40 godina, legacy iz prvih dana C-a i implenetacija za DEC i PDP masine. Danas necete naci vise nijednu platformu na kojoj je sizeof(char) != 1. That being said, zasto sam stavio bajt u navodnike je sto je definicija byte-a ono sto se razlikuje na razlicitim platformama, gde postoje ludosti kao sto su bajtovi od 9bit pa sve do 64bita. Ko hoce instant glavobolju, ovde je sve lepo objasnjeno: http://www.parashift.com/c++-faq/bytes-review.html. U svakom slucaju char je BAR 8 bita, sto pokriva sav ASCII.

Iako char moze biti signed ili unsigned u zavisnosti od kompajlera (ne platforme!), vecina uglavnom koristi ili gcc ili msvc kod kojih je char signed. Ko bas hoce da bude siguran da koristi byte kao byte koji smo pogresno naucili da je (unsigned 8 bit) treba da koristi uint8_t, pa ce kompajler implementirati taj tip u zavisnosti od platforme i svojih drugih tipova (MSVC ga implementira kao unigned char). Mnogo stvari koje radimo u C++ su blago pogresne ali su prihvatljive jer s/w koji pisemo pisemo samo za standardnu hardversku platformu ciju implementaciju znamo (x86 ili x64) kod kojih su granice bajtova, reci i duplih reci stepeni dvojke.

Za unicode (widechar) koristi se wchar_t ili unisgned short (tamo gde nema wchar_t), bar dok C++11 ne preuzme primat sa char16_t i char32_t.

Code (cpp):

//
// UNICODE (Wide Character) types
//
#ifndef _MAC
typedef wchar_t WCHAR;    // wc,   16-bit UNICODE character
#else
// some Macintosh compilers don't define wchar_t in a convenient location, or define it as a char
typedef unsigned short WCHAR;    // wc,   16-bit UNICODE character
#endif
 

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: Kako proveriti da li je char signed ili unsigned28.01.2015. u 16:23 - pre 119 meseci
Citat:
mmix: Ko bas hoce da bude siguran da koristi byte kao byte koji smo pogresno naucili da je (unsigned 8 bit) treba da koristi uint8_t, pa ce kompajler implementirati taj tip u zavisnosti od platforme i svojih drugih tipova

Hm, ako me dobro služi sjećanje na ovlaš listanje standarda - uintN_t tipovi nisu obavezni da postoje (svi ili neki): ako postoje na mašini ok, a ako ne postoje (recimo mašina nema manju memorijsku ćeliju od 16 bita) onda uint8_t uopšte neće ni biti definisan.
 
Odgovor na temu

mmix
Miljan Mitrović
Chief Software Architect
Financial Intelligence Software Ltd.
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6044



+4631 Profil

icon Re: Kako proveriti da li je char signed ili unsigned28.01.2015. u 16:33 - pre 119 meseci
Sto je opet ok, jer onda kod i nije implicitno portabilan na toj platformi i moras da ulozis trud i obratis paznju da izmenis kako treba.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
 
Odgovor na temu

[es] :: C/C++ programiranje :: Kako proveriti da li je char signed ili unsigned

[ Pregleda: 5918 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.