int i = char c? geht das? < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 12:32 Di 01.06.2010 | Autor: | misterET |
Hallo!
Es geht bei mir darum, ob ich schreiben kann:
int i;
char c;
c = 0b00110011;
i = c;
Ist dann i = 110011?
Es geht mir hier nur um die Bitkonfiguration.
Oder ist es verboten, da unterschiedliche Datentypen?
Muss man vllt schreiben i = (int)c ?
|
|
|
|
Hallo misterET,
> int i;
> char c;
>
> c = 0b00110011;
> i = c;
>
> Ist dann i = 110011?
> Es geht mir hier nur um die Bitkonfiguration.
> Oder ist es verboten, da unterschiedliche Datentypen?
> Muss man vllt schreiben i = (int)c ?
Ich denke, das ist vom Compiler abhängig. Zumindest mit folgendem Compiler unter Cygwin:
gcc (GCC) 4.3.4 20090804 (release) 1
wurde der obige Code ohne Typenkonvertierung übersetzt. Ansonsten konvertiere einfach wie du es oben erwähnt hast. Der Code an sich funktioniert so, wie du es beschrieben hast. Am Ende ist i == 51.
Viele Grüße
Karl
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:55 Do 03.06.2010 | Autor: | felixf |
Hallo,
> > int i;
> > char c;
> >
> > c = 0b00110011;
> > i = c;
> >
> > Ist dann i = 110011?
> > Es geht mir hier nur um die Bitkonfiguration.
> > Oder ist es verboten, da unterschiedliche Datentypen?
> > Muss man vllt schreiben i = (int)c ?
>
>
> Ich denke, das ist vom Compiler abhängig.
es haengt von der Maschine ab; wenn der Wertebereich eines chars eine Teilmenge des Wertebereichs eines ints ist, dann geht es, ansonsten kann man einen char nur implizit zu einem unsigned int konvertieren.
Das ist aber auf so gut wie allen Maschinen, die man benutzt, der Fall.
LG Felix
|
|
|
|
|
Hallo!
Wie gesagt, prinzipiell geht das. Das Problem ist aber ein anderes.
Es ist normalerweise möglich, einer Variablen mit größerem Definitionsbereich den Wert einer Variablen mit kleinerem bereich zuzuweisen.
Das Char (1 Byte) paßt in das Short (2 byte), dieses wiederum in das Int (4 Byte), das in das Long(8 Byte)...
Da das Char eigentlich gundsätzlich 1 Byte groß ist und das INT eigentlich auch immer größer ist, kein Problem.
AAABER:
Das char kann Vorzeichenbehaftet sein. Statt von 0 bis 255 gehts dann von -128 bis +127!
Und das führt zu Problemen:
char c=0b11101110; //Dezimal: -18
int i=c; //Dezimal immernoch -18, binär aber plötzlich 11111111111111111111111111101110
Daher rate ich, grundsätzlich die UNSIGNED version zu benutzen, wenn man mit Bits hantieren will.
Ich weiß grade nicht, was der gcc zu negativen CHARs sagt. Aber ich schreibe auch für den C18, ein Kompiler für kleine 8Bit-Microprozessoren von Microchip, und bei dem sind chars erstmal mit Vorzeichen. Man kann dem Compiler zwar nen Flag mitgeben, daß CHARs immer positiv sind, aber sicher ist sicher.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:24 Sa 05.06.2010 | Autor: | felixf |
Hallo,
> Das Char (1 Byte) paßt in das Short (2 byte), dieses
> wiederum in das Int (4 Byte), das in das Long(8 Byte)...
diese Angaben sind sehr relativ, sie haegen vom Compiler und Zielsystem ab. Gerade auf 64-Bit-Systemen, die heute auch sehr verbreitet sind, ist ein int ebenfalls 64 bit breit. (Wenn man nicht 2-Bit-Programme entwickelt.) Und ein long ist bei 32-Bit-Systemen meist 32 bit breit und nicht 64 bit; dafuer muss man meist long long nehmen (und das ist dann C 99 und (noch) kein C++).
> Daher rate ich, grundsätzlich die UNSIGNED version zu
> benutzen, wenn man mit Bits hantieren will.
Oder halt signed, je nachdem welchen Effekt man genau haben will
LG Felix
|
|
|
|