Wanneer unsigned waarden te gebruiken in een ondertekend degenen?

stemmen
66

Wanneer is het aangewezen een unsigned variabele te gebruiken over een ondertekend één? Hoe zit het in een forlus?

Ik hoor veel van de adviezen over dit en ik wilde zien of er iets dat lijkt op een consensus.

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

Ik weet dat Java niet unsigned waarden, en dat moet een bewuste beslissing over zijn Sun Microsystems deel '.

De vraag is gesteld op 02/08/2008 om 04:34
bron van user
In andere talen...                            


5 antwoorden

stemmen
61

Ik was blij te vinden een goed gesprek over dit onderwerp, zoals ik had niet echt gegeven het veel eerder gedacht.

Samengevat, tekende een goede algemene keuze - zelfs als je dood bent ervoor dat alle nummers zijn positief - als je gaat rekenen doen op de variabele (zoals in een typisch lus geval).

Als je gaat om bitwise dingen zoals maskers doen, unsigned begint te meer zin te maken. Of, als je wanhopig op zoek naar dat extra positieve bereik te krijgen door gebruik te maken van het teken bit.

Persoonlijk hou ik ondertekend, omdat ik mezelf niet vertrouwen consequent te blijven en te voorkomen dat het mengen van de twee soorten (zoals het artikel waarschuwt tegen).

antwoordde op 02/08/2008 om 04:49
bron van user

stemmen
8

In boven je bijvoorbeeld bij 'i' zal altijd positief zijn en een hoger bereik zou gunstig zijn, niet ondertekend nuttig zou zijn. Net als u 'verklaren' uitspraken, zoals:

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

Vooral wanneer deze waarden zal nooit veranderen.

Echter, als je aan het doen bent een boekhoudprogramma waar de mensen zijn onverantwoordelijk met hun geld en zijn constant in de rode, zult u zeker wilt gebruiken 'getekend'.

Ik ben het eens met heilige al is dat een goede vuistregel is het gebruik van ondertekend, waarin C eigenlijk standaard, dus je bent gedekt.

antwoordde op 02/08/2008 om 05:31
bron van user

stemmen
6

size_tis vaak een goede keuze voor deze, of size_typeals u een STL klasse.

antwoordde op 02/08/2008 om 06:51
bron van user

stemmen
7

C en C ++ compilers zal een waarschuwing genereren wanneer je het vergelijkt ondertekend en unsigned types; in uw voorbeeld code, kon je niet je lusvariabele unsigned maken en hebben de compiler genereren code zonder waarschuwingen (ervan uitgaande dat de waarschuwingen werden ingeschakeld).

Natuurlijk, je compileren met waarschuwingen draaide helemaal naar boven, toch?

En, Hebt u overwogen compileren met "behandelen waarschuwingen als fouten" om het te nemen dat een stap verder?

Het nadeel met het gebruik van ondertekend nummers is dat er een verleiding om ze te overbelasten, zodat bijvoorbeeld de waarden 0-> n zijn de menu selectie, en -1 betekent dat er niets is gekozen - in plaats van het creëren van een klasse die twee variabelen, een aan heeft geven als er iets is geselecteerd en een ander op te slaan wat die keuze is. Voor je het weet, ben je het testen van negatieve over de plaats en de compiler klaagt over hoe je wil het menu selectie tegen het aantal menu selecties je vergelijken - maar dat is gevaarlijk omdat ze verschillende soorten . Dus doe dat niet.

antwoordde op 04/08/2008 om 14:35
bron van user

stemmen
7

Ik zou denken dat als uw business case schrijft voor dat een negatief getal ongeldig is, zou je willen een fout weergegeven of gegooid te hebben.

Met dat in het achterhoofd, vond ik pas onlangs uit over unsigned integers tijdens het werken aan een project de verwerking van gegevens in een binair bestand en het opslaan van de gegevens in een database. Ik was met opzet "corrumperende" de binaire data, en uiteindelijk negatieve waarden in plaats van een verwachte fout. Ik vond dat, hoewel de waarde omgerekend, de waarde niet geldig was voor mijn business case.
Mijn programma niet fout, en ik kreeg uiteindelijk verkeerde gegevens in de database. Het zou beter zijn geweest als ik had gebruikt uinten had het programma te mislukken.

antwoordde op 10/11/2008 om 20:04
bron van user

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