È solo indirettamente un problema.
cose brutte possono accadere se si utilizzano interi firmati per operazioni bit per bit, come &
, |
, <<
e >>
.
completamente diverse cose brutte possono accadere se si utilizzano numeri interi senza segno per l'aritmetica (underflow, cicli infiniti quando si verifica se un numero è >= 0
etc.)
A causa di questo, alcuni compilatori e strumenti di verifica statica emetterà avvisi quando si mescolano interi con segno e senza segno in entrambi i tipi di operazione (aritmetica o manipolazione dei bit.)
Sebbene sia possibile mischiarli in casi semplici come nell'esempio, se lo si fa significa che non è possibile utilizzare quegli strumenti di controllo statici (o deve disabilitare quegli avvertimenti) il che potrebbe significare che altri bug non vengono rilevati.
A volte non hai scelta, ad es. quando si esegue l'aritmetica su valori di tipo size_t
nel codice di gestione della memoria.
Nel tuo esempio vorrei bastone a int
, proprio perché è più semplice avere un minor numero di tipi, e il int
sta per essere lì in ogni caso in quanto è il tipo del primo argomento a main()
.
Non proprio un dupe, ma vale la pena leggerlo comunque: http://stackoverflow.com/questions/859943/c-how-can-i-fix-warnings-like-comparison-between-signed-and-unsigned – finnw