Domanda

Quando è opportuno utilizzare una variabile unsigned oltre firmato uno?Che dire, in un for loop?

Ho sentito un sacco di pareri su questo e ho voluto vedere se c'era qualcosa di simile a un consenso.

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

So che Java non ha valori senza segno, e che deve essere stata una decisione consapevole Sun Microsystems'parte.

È stato utile?

Soluzione

Sono stato felice di trovare una buona conversazione su questo argomento, come non avevo dato molto pensato prima.

In sintesi, firmato è una buona scelta, anche quando sei morto sicuro che tutti i numeri sono positivi - se hai intenzione di fare aritmetica della variabile (come in un tipico ciclo per caso).

Se avete intenzione di fare bit per bit cose come maschere, unsigned inizia ad avere più senso.Oppure, se stai cercando di ottenere extra campo positivo, sfruttando il bit di segno.

Personalmente, mi piace firmato perché non mi fido di me stesso per rimanere coerenti e evitare di mescolare i due tipi (come l'articolo che mette in guardia contro).

Altri suggerimenti

Nel tuo esempio sopra, quando 'i' sarà sempre positivo e un intervallo più sarebbe utile, unsigned sarebbe utile.Ad esempio, se stai usando 'dichiarare' le dichiarazioni, come:

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

Soprattutto quando questi valori non cambierà mai.

Tuttavia, se si sta facendo un programma di contabilità in cui le persone sono irresponsabili, che con i loro soldi e sono costantemente in rosso, sarà sicuramente desidera utilizzare la 'firma'.

Sono d'accordo con saint però che una buona regola è quella di utilizzare il sottoscritto, che C in realtà di default, così sei coperto.

C e compilatori C++ genera un messaggio di avviso quando si confrontano signed e unsigned tipi;nel codice di esempio, si poteva fare di ciclo variabile unsigned e il compilatore di generare codice senza avvisi (supponendo detto che gli avvisi sono stati attivati).

Naturalmente, si sta compilando con avvisi girato tutto il senso fino, giusto?

E, avete considerato la compilazione con "trattare gli avvisi come" errori di prendere un ulteriore passo avanti?

Il rovescio della medaglia con numeri con segno è che ci sia la tentazione di sovraccarico, in modo che, per esempio, i valori 0->n sono il menu di selezione, e -1 significa che nulla è selezionata, piuttosto che la creazione di una classe che dispone di due variabili, una per indicare se qualcosa è selezionata e un altro per memorizzare ciò che la selezione si.Prima che tu lo sai, si sta testando per il negativo in tutto il luogo e il compilatore si lamenta di come hai intenzione di confrontare il menu di selezione, il numero di menu selezioni - ma è pericoloso perché sono diversi tipi.Quindi non farlo.

Penso che se il tuo business case detta che un numero negativo non è valido, si sarebbe vuoi per avere un messaggio di errore visualizzato o gettato.

Con questo in mente, ho solo recentemente scoperto integer senza segno, mentre si lavora su un progetto di elaborazione di dati in un file binario e la memorizzazione dei dati in un database.Sono stato volutamente "corrompere" i dati binari, e finì per ottenere i valori negativi invece di un errore previsto.Ho trovato che anche se il valore convertito, il valore non è valido per il mio caso aziendale.
Il mio programma non è errore, e ho finito per ottenere sbagliato i dati nel database.Sarebbe stato meglio se avessi usato uint e aveva il programma di esito negativo.

size_t è spesso una buona scelta per questo, o size_type se si utilizza una classe STL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top