Laden...

Unterschied zwischen i+=1 vs. i=i+1 bei Bytes

Erstellt von ChrisV vor 11 Jahren Letzter Beitrag vor 11 Jahren 965 Views
C
ChrisV Themenstarter:in
2 Beiträge seit 2013
vor 11 Jahren
Unterschied zwischen i+=1 vs. i=i+1 bei Bytes

Hallo,

Kann mir jemand den Unterschied der beiden unteren Ausdrücke erklären?

byte i=1;

i+=1; // Wird anstandslos ausgeführt
i=i+1; // Fehler (s.u.)

Fehlermeldung:
Der Typ 'int' kann nicht implizit in 'byte' konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)

Das Literal "1" wird ja vom Compiler als int behandelt. Wenn ich dann einen int auf ein byte addieren möchte, habe ich einen Typkonflikt. Soweit so klar. Wieso wird es aber in der Form

i+=1;

anstandslos ausgeführt wohingegen

i=i+1;

nicht akzeptiert wird. Auch ein

i=i+(byte)1;

hilt nichts.

Danke für eure Hilfe,
Christof

185 Beiträge seit 2005
vor 11 Jahren

wenn, dann so:



i=(byte) i+1;


Hinweis von herbivore vor 11 Jahren

Es muss heißen:

i=(byte)(i+1);
C
258 Beiträge seit 2011
vor 11 Jahren

Das liegt daran das es keinen + Operator für bytes gibt, da diese nicht für Rechenoperationen gedacht sind. Das Problem ist also das dein byte zu einem int convertiert wird (nicht nur weil die Zahl als int interpretiert wird).

Du kannst keine 2 bytes addieren und einem byte zuweisen.

Warum jedoch += funktioniert weis ich nicht.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo ChrisV,

die Antwort auf deine Frage ergibt sich aus folgenden Kapiteln der Sprach-Spezikation ECMA-334 sowie der C#-Referenz:

14.7.4 Addition operator

Es gibt also - wie Console32 sagt - überhaupt keinen Operator byte operator +(byte x, byte y) und auch keinen int operator +(byte x, byte y) und erst recht keinen byte operator +(int x, int y).

14.2.6.2 Binary numeric promotions

Stattdessen werden die Parameter nach der letzten Regel in ints convertiert (und dann entsprechend der Operator int operator +(int x, int y) verwendet). Deswegen hilft es auch nicht, das Literal auf byte zu casten, weil es implizit sowieso wieder in einen int umgewandelt wird.

byte (C#-Referenz)
"Numerische Typen mit einer größeren Speichergröße, die keine Literale sind, können nicht implizit in byte konvertiert werden." Das Ergebnis der Additionsoperation ist ein int. Deshalb klappt die (anschließende) Zuweisung an ein byte nicht ohne explizite Konvertierung.

14.14.2 Compound assignment

Zusammengesetzte Zuweisungen (wie +=) basieren zwar auf den passenden binären Operatoren (hier also +), aber das Ergebnis wird implizit auf den Typ des linken Operanden konvertiert.

herbivore

D
96 Beiträge seit 2012
vor 11 Jahren

Ergänzend zu der Antwort von Console32:
7.13.2 Compound assignment (C#)

Das Verhalten kann man als Compiler-Feature betrachten.

byte b = 0;
b += x;
// Wird zu b = (byte)(b + x);

Es funktioniert nur, wenn der der Compiler garantieren kann, dass x zu einem Byte konvertiert werden kann, ohne dass Daten verloren gehen. Dies ist der Fall, wenn x ein Integer-Literal kleiner als 256 ist oder x als konstanter Integer definiert wurde und kleiner als 256 ist. Interessanterweise ist eine long-Konstante kleiner als 256 nicht gültig.


byte b = 0;
int x1 = 100;
const int x2 = 100;
b += 100; // Geht
b += x2; // Geht
b += x1; // Geht nicht
C
ChrisV Themenstarter:in
2 Beiträge seit 2013
vor 11 Jahren

Wow. Vielen Dank für die ausführlichen, schnellen und erklärenden Antworten.

Gruß Christof