2016-03-31 11 views
0

Ich habe zwei Variablen.Warum kann ich einen int nicht von einem uint subtrahieren?

int x = 1; 
uint y = 2; 

Die Typen müssen int und uint bleiben. Trotzdem kann ich mit ihnen keine Grundrechenarten durchführen.

y += x; 

kann nicht implizit Typ 'int' auf 'uint' konvertieren. Eine explizite Konvertierung existiert (fehlt Ihnen eine Besetzung?)

Also muss ich so etwas immer tun?

if (x < 0) 
{ 
    y -= (uint)Math.Abs(x); 
} 
else 
{ 
    y += (uint)x; 
} 

Kommt aus einem C/C++/Java-Hintergrund, das verwirrt mich.
Gibt es etwas, das mir hier fehlt?

Warum unterscheidet sich dieses Verhalten von den anderen genannten Sprachen?
Gibt es bessere Alternativen?

Ich nehme an, das ist eine häufige Reise bis zu Neulingen der Sprache.
Nein, ich bin nicht auf Unterlauf angewiesen.

+1

'Zur Durchführung y + = x' eine Umwandlung von' int' zu 'uint' muss durchgeführt werden. Da diese Konvertierung verlustbehaftet ist, müssen Sie den Compiler explizit ausführen. – MarcinJuraszek

Antwort

2

Es gibt keine Garantie, dass ein int in einen uint passt, deshalb erhalten Sie den Compilerfehler.

Wenn Sie wirklich die Operation ausführen möchten (das heißt, wenn Sie irgendwie wissen, dass die Zahlen passen), können Sie wie Sie casten oder Convert Methoden verwenden.

if (x < 0) 
{ 
    y -= Convert.ToUint32(Math.Abs(x)); 
} 
else 
{ 
    y += Convert.ToUint32(x); 
} 

Wenn Sie nicht sicher sind, ob die Zahlen passen, können Sie sie einfach klemmen:

uint result = Math.Max(uint.MinValue(Math.Min(uint.MaxValue, x)) 

Auch in einigen Fällen können Sie einen unchecked Kontext verwenden. Dies führt nicht zu Fehlern, aber es werden Werte überlaufen, die größer sind, als es möglich ist.

Endlich, wenn Sie zwischen den Bereich der möglichen Werte zuordnen möchten, verwenden Sie int.MaxValue als Offset:

uint x = someuint(); 
int y = Convert.ToInt32(x - int.MaxValue); 

int w = someint(); 
uint z = Convert.ToUint32(w + int.MaxValue); 
+0

Ich kann Int nicht verwenden, weil es möglicherweise negativ ist oder einen Unterlauf verursacht, aber ich kann trotzdem einen anderen Uint- und Case-Unterlauf verwenden? Sie sind System.Int32 und System.UInt32. Bedeutet das nicht, dass sie garantiert die gleiche Größe haben? –

+0

Sie haben die gleiche Größe in Bits, aber sie repräsentieren nicht die gleichen numerischen Werte. Sie können beispielsweise -1 nicht als Uint32 darstellen. Aber wenn alles, was Sie wollen, ist _map_ zwischen ihnen, dann können Sie eine "Verschiebung" anwenden, indem Sie hinzufügen oder subtrahieren "int.MaxValue", die die Hälfte der darstellbaren Bereich von beiden überspannt. – heltonbiker

Verwandte Themen