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.

È stato utile?

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!

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