Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 5 odgovora
  • 2.556 pregleda

Najnovija ↓

C++ signed i unsigned 16.06.2013. u 01:36 · pre 162 meseca #1
Imam par nejasnih stvari sto se tice ovoga.
Sama definicija kaze da celobrojni tipovi (short i long) bez reci unsigned su signed, po definiciji. Signed celobrojne promenljive imaju ili negativnu ili pozitivnu vrednost.
Unsigned celobrojne promenljive uvek imaju pozitivnu vrednost.

Npr:
unsigned short prima brojeve od 0 do 65.535
signed short prima brojeve od -32.768 do 32.768

Sada sta mene buni ako ja napravim:

Code:
     
     unsigned short int b = 1;
     std::cout << b;

Citat:
// output >> 1


a ako stavim unsigned short int b = -1;
Citat:
// output >> 65535


Sada mene zanima kako je on dosao do ovog broja 65535? Ako UNS neprima negativne brojeve odakle onda ova vrednost? Zasto nije greska?
Re: C++ signed i unsigned 16.06.2013. u 10:57 · pre 162 meseca
izmenjeno 1 put, poslednji put X Files 16.06.2013. u 11:14
  1. X Files16.06.2013. u 11:14zapis iz teksta poruke
#2
Citat:
_ikacsigned short prima brojeve od -32.768 do 32.768

Tačnije, od -32768 do 32767. U zbiru, to je 65536, jer je tu i nula.
Citat:

a ako stavim unsigned short int b = -1;
...
Sada mene zanima kako je on dosao do ovog broja 65535? Ako UNS neprima negativne brojeve odakle onda ova vrednost? Zasto nije greska?

Rezultat ispisa nije -1, nego je 65535. Prema tome, unsigned short nije primio negativan broj.

Onako, na prvu loptu, mislim da se sadržaj unsigned shorta "pegla" po modulu:
b % 65536
... ma šta mu dodeljeno s desne strane.



Ponekad se kod ovakvih delova koda koristi assert(), da se (u nekoj fazi razvoja) uveriš da u kodu slučajno ne dolazi do nepredviđenih vrednosti:
http://www.cplusplus.com/reference/cassert/assert/
Re: C++ signed i unsigned 16.06.2013. u 12:12 · pre 162 meseca #3
Citat:
Rezultat ispisa nije -1, nego je 65535. Prema tome, unsigned short nije primio negativan broj.

Pa to sam ja i napisao samo nisi pogledao bolje.
Hvala u svakom slucaju izgooglao sam nesto ali opet iole mi je jasno. :/
Re: C++ signed i unsigned 16.06.2013. u 12:30 · pre 162 meseca #4
-1 je 1111....11 u binarnom zapisu. Ako taj binaran zapis posmatramo kao signed broj, on se u dekadni pretvara kao -2^15 + 2^15 + 2^14 + ... + 2^1 + 2^0, sto je -1.
Ako se to predstavi kao unsigned broj, to ce biti 65535 (najznacajniji bit sad nije -2^15 vec +2^15).
Re: C++ signed i unsigned 16.06.2013. u 14:03 · pre 162 meseca #5
Ono što tebe buni jeste nemogućnost kompajlera da te upozori da dodeljuješ negativnu konstatnu neoznačenoj vrednosti. Kompajler to neće uraditi jer nema nikakve opasnosti po tebe, samo će se ta vrednost interpretirati na drugi način, program se neće neočekivano ponašati.

Ono što je opasno je poređenje, i tu će te kompajler valjano upozoriti:

Code:

unsigned int i = 5;
int j = -1;

if(i < j)
    cout << "Manje!";
else
    cout << "Veće!";


U ovom slučaju, j će se promovisati u unsigned tip i rezultat će biti "Manje" jer je 5 manje od std::numeric_limits<unsigned> - 1.
Re: C++ signed i unsigned 18.06.2013. u 15:25 · pre 162 meseca #6
Zahvaljujem na odgovorima i na pomoci.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme