explizite typumwandlung
-
hallo,
habe eine doofe frage zur typumwandlung(c#). und zwar folgende situation:
byte flags; // div. anweisung flags = flags << 1; //Shifte ein Bit nach links
dann bekomme ich den fehler in der zeile
flags = flags << 1;
Fehler 1 Der Typ "int" kann nicht implizit in "byte" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)
ich versteh nicht so ganz womit er probleme hat.. mit der 1 ?
danke und gruß
-
Bin mir nicht sicher, aber mach doch mal ne Klammer um flags << 1.
-
Hallo Da_Pedro !
Eine bitweise Verschiebung nach links oder recht funktioniert nur mit den Datentypen int (32 Bit) oder long (64 Bit). In Deinem Beispiel versuchts Du eine int-Operation (flags << 1) in ein byte-Datentyp zu schreiben. Auch wenn Du Deine Variable 'flags' als byte-Datentyp deklarierst, bei der Shift-Operation wird dieses als int bzw. long (abhängig wohin Du das Ergebnis der Operation speichern möchtest) gecastet. Das Problem liegt also nicht in der Shift-Operation, sondern in dem Versuch diese in einem byte-Datentyp zu speichern.
Hier ein funktionierendes Beispiel :
byte flags = 2; int erg = flags << 1; // Das Ergebnis 4 wird in einem int-Datentyp gespeichert
Gruß Ernst
-
ich dachte bei
flags = flags << 1;
würde die 1 zum datentyp int defaulten und dass der compiler möchte, dass du
flags = flags << (byte)1;
diese vorher castest.
-
komisch schrieb:
ich dachte bei
flags = flags << 1;
würde die 1 zum datentyp int defaulten und dass der compiler möchte, dass du
flags = flags << (byte)1;
diese vorher castest.
Ein kurzer Auszug aus den MSDN :
C# Programmer's Reference
<< Operator (C# Reference)The left-shift operator (<<) shifts its first operand left by the number of bits specified by its second operand. The type of the second operand must be an int.
Das Einzige was geht ist folgendes :
flags = (byte)(flags << 1);
Dies ändert aber nicht die Tatsache, dass flags << 1 eine int-Operation ist.
Gruß Ernst
-
flags = (byte)(flags << 1);
das byte ist in diesem beispiel absolut überflüssig da flags ein int sein muss aber dann zum byte konvertiert wird um anschließend wieder int zu werden....
int flags = 123; byte erg; erg = (byte)(flags << 1);
kann ich mir vorstellen
ansosnten noch wenn flags byte ist
flags = (byte)(convert.ToInt(flags) << 1);
-
Jack30lena schrieb:
flags = (byte)(flags << 1);
das byte ist in diesem beispiel absolut überflüssig da flags ein int sein muss aber dann zum byte konvertiert wird um anschließend wieder int zu werden....
Nein, im Originalbeitrag von da_Pedro war 'flags' noch ein byte, deshalb hatte er ja erst diese Probleme (die Umwandlung von byte nach int für die Eingabe von op<< klappt ohne Probleme, die Rückumwandlung muß dann explizit angegeben werden).
-
MacReeg schrieb:
The type of the second operand must be an int.
Der 2. Operand steht rechts vom '<<'-Operator und muss vom Datentyp int sein - das bezieht sich auf die '1'.
Gruß Ernst
-
hi,
danke für die zahlreichen antworten und diskussion. da ich nur mit 8 bit arbeiten will, wandle ich wieder in byte um. funktioniert super.
byte flags = 2; //mit hilfe von flags was ausgeben int erg = flags << 1; flags = (byte)erg;
-
hi,
sry für doppelpost aber eine frage habe ich noch:
wie kann ich ein array in einem mehrdimensionalen array speichern?
habe folgende init:
//schleifen etc. int[,] alle_monate = new int[4,3]; int[] dummy_monat = new int[monatstage[i]]; //berechnungen.. alle_monate[i,j] = dummy_monat;
bei dem krieg ich wieder einen konvertierungsfehler, dass ich halt ein array nicth in int speichern kann aber wie kann bei der definition sagen das ich kein einfaches int sondern ein int-array speichern will?
Eine implizite Konvertierung vom Typ "int[]" in "int" ist nicht möglich.
-
ich bin mir nicht sicher aber versuch mal
int[,] mehrdimensional = new int[5,6]; int[] eindimensional = new int[6]; mehrdimensional[1,] = eindimensional;