Vă mulțumim pentru susținere

Când să folosim valorile nesemnate peste cele semnate?

Când este potrivit să utilizați o variabilă nesemnată peste o semnătură semnată? Ce se intampla intr-o bucla pentru ?

Am auzit o mulțime de opinii despre asta și am vrut să văd dacă există ceva asemănător cu un consens.

for (unsigned int i = 0; i < someThing.length(); i++) {  
    SomeThing var = someThing.at(i);  
    // You get the idea.  
}

Știu că Java nu are valori nesemnate și că trebuie să fi fost o decizie conștientă despre Sun Microsystems o parte.

0
adăugat editat
adăugat autor mk12
Cred că această întrebare este destul de bazată pe opinie. Codul prezentat va funcționa în ambele cazuri foarte bine, astfel încât să puteți utiliza ambele. Cu excepția motivelor de performanță (nici un răspuns nu se referă de fapt la performanță până acum) este doar un gust personal.
adăugat autor Trilarion

5 răspunsuri

Am fost încântată să găsesc o conversație bună pe această temă, pentru că nu mi-am dat prea mult seama înainte.

În rezumat, semnarea este o alegere generală bună - chiar și atunci când sunteți sigur că toate numerele sunt pozitive - dacă intenționați să efectuați aritmetică asupra variabilei (ca într-un caz tipic pentru buclă).

Dacă vrei să faci lucruri asemănătoare cu măștile, nesemnatul începe să aibă mai multă sens. Sau, dacă esti disperat să obțineți acea gamă extra pozitivă, profitând de semnul biți.

Personal, îmi place semnat pentru că nu am încredere în mine să rămân consecvent și să evit amestecul celor două tipuri (așa cum avertizează articolul).

0
adăugat
Mai târziu, în acel fir, se arată că unsigned este mult superioară pentru detectarea depășirii în intrări nesigure. Din păcate, "răspunsurile" propuse la puzzle nu sunt atât de grozave. Mine este template bool interval_check_sum (nesemnat a, nesemnat b) {retur (o Dacă cineva are un răspuns similar simplu și direct folosind tipurile semnate, mi-ar plăcea să-l văd.
adăugat autor Ben Voigt

size_t is often a good choice for this, or size_type if you're using an STL class.

0
adăugat
Numai atunci când aveți de-a face cu dimensiunea ceva în octeți.
adăugat autor mk12

În exemplul de mai sus, atunci când "i" va fi întotdeauna pozitiv și o gamă mai mare ar fi benefică, nesemnatul ar fi util. De parcă utilizați declarații de declarare, cum ar fi:

#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)

Mai ales când aceste valori nu se vor schimba niciodată.

Cu toate acestea, dacă faceți un program de contabilitate în care oamenii sunt iresponsabili cu banii și sunt în mod constant în roșu, cu siguranță veți dori să utilizați "semnat".

Sunt de acord cu sfântul, deși o regulă bună este să folosiți semnătura, de fapt C, care este implicită, astfel că sunteți acoperit.

0
adăugat

Componentele C și C ++ vor genera un avertisment atunci când comparați tipurile semnate și nesemnate; în exemplul dvs. de cod, nu ați putut face variabila dvs. de buclă nesemnată și să aveți compilatorul să genereze cod fără avertismente (presupunând că avertismentele menționate au fost activate).

Firește, compilați cu avertismente întoarse până la capăt, nu?

Și, ați luat în considerare compilarea cu "avertismente de tratat ca erori" pentru ao lua cu un pas mai departe?

The downside with using signed numbers is that there's a temptation to overload them so that, for example, the values 0->n are the menu selection, and -1 means nothing's selected - rather than creating a class that has two variables, one to indicate if something is selected and another to store what that selection is. Before you know it, you're testing for negative one all over the place and the compiler is complaining about how you're wanting to compare the menu selection against the number of menu selections you have - but that's dangerous because they're different types. So don't do that.

0
adăugat

Mi-aș fi de părere că dacă afacerea dvs. dictează că un număr negativ este nevalid, ați dori să doriți să apară o eroare sau să fie aruncată.

Având în vedere acest lucru, am aflat recent despre numere nesemnate în timp ce lucrați la un proiect de prelucrare a datelor într-un fișier binar și stocarea datelor într-o bază de date. Am fost intenționat "coruperea" datelor binare și am ajuns să obțin valori negative în loc de o eroare așteptată. Am constatat că, deși valoarea convertită, valoarea nu era valabilă pentru cazul meu de afaceri Programul meu nu a eronat și am ajuns să obțin datele greșite în baza de date. Ar fi fost mai bine dacă aș fi folosit uint și dacă programul ar fi eșuat.

0
adăugat