Når du skal bruke usignerte verdier i løpet av signerte utgaver?

stemmer
69

Når er det riktig å bruke en usignert variabel over et signert en? Hva med i en forloop?

Jeg hører mange meninger om dette, og jeg ønsket å se om det var noe som lignet på en konsensus.

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

Jeg vet Java har ikke usignerte verdier, og det må ha vært en bevisst beslutning om Sun Microsystems 'del.

Publisert på 02/08/2008 klokken 03:34
kilden bruker
På andre språk...                            


5 svar

stemmer
63

Jeg var glad for å finne en god samtale om dette temaet, som jeg ikke hadde egentlig gitt det mye trodde før.

Oppsummert signert er en god generell valg - selv når du er død for at alle tallene er positive - hvis du kommer til å regne på den variable (som i et typisk for loop tilfelle).

Hvis du kommer til å gjøre bitvis ting som masker, til usignerte starter være mer fornuftig. Eller, hvis du er desperat etter å få den ekstra positiv område ved å dra nytte av skiltet bit.

Personlig liker jeg registrerte fordi jeg ikke stoler på meg selv for å være konsekvent og unngå å blande de to typene (som artikkelen advarer mot).

Svarte 02/08/2008 kl. 03:49
kilden bruker

stemmer
9

I eksempelet ovenfor, når 'i' vil alltid være positiv og et høyere område vil være fordelaktig, usignert ville være nyttig. Som hvis du bruker 'erklære uttalelser, for eksempel:

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

Spesielt når disse verdiene vil aldri forandre seg.

Men hvis du gjør et regnskapsprogram der folk er uansvarlig med pengene sine og er stadig i rødt, vil du mest definitivt ønsker å bruke 'signert'.

Jeg er enig med helgen om at en god tommelfingerregel er å bruke undertegnet, som C faktisk som standard, slik at du er dekket.

Svarte 02/08/2008 kl. 04:31
kilden bruker

stemmer
7

Jeg vil tro at hvis din business case tilsier at et negativt tall er ugyldig, vil du ønsker å ha en feil vises eller kastet.

Med det i tankene, jeg bare nylig funnet ut om usignerte heltall mens du arbeider på et prosjekt behandling av data i en binær fil og lagre data i en database. Jeg var med vilje "ødelegge" det binære data, og endte opp med å få negative verdier i stedet for en forventet feil. Jeg fant ut at selv om verdien konvertert, verdien var ikke gyldig for min business case.
Mitt program ikke feil, og jeg endte opp med å få feil data inn i databasen. Det ville vært bedre om jeg hadde brukt uintog hadde programmet mislykkes.

Svarte 10/11/2008 kl. 19:04
kilden bruker

stemmer
7

C og C ++ kompilatorer vil generere en advarsel når du sammenligner signerte og usignerte typer; i eksempelkode, kan du ikke lage din løkke variabel usignert og har kompilatoren generere kode uten advarsler (forutsatt at advarslene ble slått på).

Naturligvis, du kompilere med advarsler skrudd helt opp, ikke sant?

Og, har du vurdert å kompilere med "behandle advarsler som feil" å ta det ett skritt videre?

Ulempen med å bruke signerte tall er at det er en fristelse for å overbelaste dem slik at, for eksempel, de verdier som 0-> n de menyvalg, og -1 betyr ingenting er valgt - snarere enn å skape en klasse som har to variabler, ett til indikere om noe er valgt, og en annen til å lagre hva som utvalget er. Før du vet ordet av det, er du teste for negative en over alt, og kompilatoren klager om hvordan du ønsker å sammenligne menyvalget mot antall menyvalg du har - men det er farlig fordi de er forskjellige typer . Så ikke gjør det.

Svarte 04/08/2008 kl. 13:35
kilden bruker

stemmer
7

size_ter ofte et godt valg for dette, eller size_typehvis du bruker en STL klasse.

Svarte 02/08/2008 kl. 05:51
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more