Division e NSUInteger
-
22-07-2019 - |
Domanda
Ho dei calcoli che implicano valori negativi:
row = (stagePosition - col) / PHNumRow;
Dire che stagePosition è -7 e col è 1. Sono entrambi NSInteger, inclusa la riga. PHNumRow è 8.
Se PHNumRow è NSInteger, ottengo il risultato che mi aspetto: -1. Ma se PHNumRow è NSUInteger, il risultato è spazzatura.
Perché dovrebbe importare se il divisore non è firmato o firmato? Non inserisco il risultato in un int senza segno.
Soluzione
A causa della promozione di numeri interi. Quando viene valutato il lato destro, tutti gli argomenti vengono promossi al tipo più alto di operandi dell'espressione che, se PHNumRow
è senza segno, sarà intero senza segno. Il compilatore fa qualcosa di simile al seguente:
((NSUInteger)stagePosition - (NSUInteger)col) / PHNumRow;
Dato che stagePosition
è negativo, c'è un avvolgente e il tuo calcolo diventa boom!