Typ Casting benötigt für Byte = Byte - Byte?

8

Ich habe den folgenden Code:

%Vor%

Wenn ich das tue, erhalte ich den folgenden Fehler:

%Vor%

Jeder Teil dieser Anweisung ist ein Byte. Warum möchte C # das byte.MaxValue - b in ein int konvertieren?

Kannst du das nicht ohne Gießen machen? (d. h. ich möchte das nicht tun müssen: byte inv = (byte) (byte.MaxValue - b); )

    
Vaccano 17.04.2010, 04:42
quelle

3 Antworten

4

Gemäß der C # -Sprachreferenz :

  

, weil der arithmetische Ausdruck auf der rechten Seite des Zuweisungsoperators standardmäßig zu int ausgewertet wird.

Der Grund dafür könnte sein, dass Ihr Prozessor beim Zugriff auf eine 4-Byte-Speicheradresse schneller ist als bei einer 1-Byte-Speicheradresse, sodass arithmetische Operatoren für die Arbeit an 4-Byte-Operanden definiert sind.

    
Bill the Lizard 17.04.2010 04:46
quelle
4

Raymond Chen beantwortet Ihre Frage hier:

Ссылка

    
Eric Lippert 17.04.2010 08:45
quelle
2

Für Addition, Multiplikation und Subtraktion gibt es eine ziemlich gute Erklärung: Die Carry-Bits in die Berechnung einzubeziehen und dann wegzuwerfen ist viel einfacher als die Carry-Bits herauszufinden, wenn sie ursprünglich weggeworfen wurden.

Für bitweise Operatoren (Schnittpunkt, inklusive Vereinigung, exklusive Vereinigung, Komplement) ist diese Argumentation einfach nicht stichhaltig. Das einzige, was ich mir vorstellen kann, ist, dass die Vorzeichenerweiterung etwas mehrdeutig wäre, wenn Sie mit einer Mischung aus vorzeichenbehafteten und unsignierten Operanden beginnen und dann das Ergebnis in einem breiteren Typ speichern würden. Aber das erklärt nicht, warum bitweise Operationen, die unär sind oder alle Operanden den gleichen Typ haben, das Ergebnis auf int erweitern sollten. Ich halte es für einen sehr ärgerlichen Konstruktionsfehler mit C #, dass:

%Vor%

erzeugt einen Fehler.

    
Ben Voigt 17.04.2010 05:10
quelle

Tags und Links