2009-03-14 10 views
0

j'ai un calcul qui implique des valeurs négatives:et NSUInteger

row = (stagePosition - col)/PHNumRow; 

Say est stagePosition -7 et col est 1. Ils sont tous les deux NSInteger, y compris la ligne. PHNumRow est 8.

Si PHNumRow est NSInteger, j'obtiens le résultat attendu: -1. Mais si PHNumRow est NSUInteger, le résultat est garbage.

Pourquoi est-ce important si le diviseur est non signé ou signé? Je ne mets pas le résultat dans un int non signé.

Répondre

4

En raison de la promotion d'entier. Lorsque le côté droit est évalué, tous les arguments sont promus au type le plus élevé des opérandes de l'expression qui, si PHNumRow est non signé, sera un entier non signé. Le compilateur fait quelque chose de similaire à ce qui suit:

((NSUInteger)stagePosition - (NSUInteger)col)/PHNumRow; 

Depuis, stagePosition est négatif, il y a un bouclage et votre calcul fait boum!

+0

Merci. Je suppose que ce n'est pas une bonne idée d'utiliser sans signe si indistinctement. – hyn