2009-03-14 13 views
0

Ich habe einige Berechnung, die negative Werte beinhaltet:Abteilung und NSUInteger

row = (stagePosition - col)/PHNumRow; 

Say stagePosition ist -7 und col ist 1. Sie sind beide NSInteger, einschließlich Reihe. PHNumRow ist 8.

Wenn PHNumRow NSInteger ist, bekomme ich das Ergebnis erwarte ich: -1. Aber wenn PHNumRow NSUInteger ist, ist das Ergebnis Müll.

Warum sollte es eine Rolle spielen, ob der Divisor nicht signiert oder unterschrieben ist? Ich gebe das Ergebnis nicht in einen unsigned int.

Antwort

4

Wegen der ganzzahligen Förderung. Wenn die rechte Seite ausgewertet wird, werden alle Argumente zum höchsten Typ der Operanden des Ausdrucks befördert, der, wenn PHNumRow nicht vorzeichenbehaftet ist, eine Ganzzahl ohne Vorzeichen ist. Der Compiler tut etwas ähnlich der folgenden:

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

Da stagePosition negativ ist, gibt es einen Wraparound und Ihre Berechnung geht boom!

+0

Danke. Ich denke, es ist keine gute Idee, unsigniert so wahllos zu verwenden. – hyn

Verwandte Themen