Forum: Mikrocontroller und Digitale Elektronik typcast unsigned char nach char


von Ralf (Gast)


Lesenswert?

Hallo,

kann mir jemand auf die Sprünge helfen, wie ich in winavr ein unsigned 
char in ein char caste...bzw.  ein unsigned long in ein unsigned (nur 
das niedere byte).
Ich will eine Software auf einen Atmega portieren, allerdings werden im 
code eben unsigned char und unsigned long (32bit) verwendet, in den 
benötigten avr spezifischen funktionen allerdings char und unsigned für 
diese beiden Datentypen.
Stehe gerade ziemlich auf dem Schlauch...sorry!

Grüsse Ralf

von Philipp B. (philipp_burch)


Lesenswert?

unsigned char bla = (unsigned char)abc

So kannst du alles casten, der Compiler wird dich nicht daran hindern. 
Ob's dann auch funzt ist eine andere Frage, daher: Überlegen was du tust 
;)

Wenn du in einen kleineren Datentypen castest wird immer nur der untere 
Teil verwendet.

von Ale (Gast)


Lesenswert?

Am besten nicht so viel unsigned longs (avr ist nur 8 bitter).

char a_char_var;
unsigned char a_uchar_var;

void foo( void )
{
    a_uchar_var = 45;

    a_char_var = (char) a_uchar_var;  // (char) : cast

    a_char_var = -45;

    a_uchar_var = (unsigned char) a_char_var; // Hier -45 pass nicht
                                              // weil -45 es ist nicht
                                              // zwischen 0 und 255
                                              // so du wirst 211 bekomen 
!

}

Beachten: "unsigned" gleich als "unsigned int"




von Ralf (Gast)


Lesenswert?

Hallo,
danke für Deine Antwort.

Wenn du in einen kleineren Datentypen castest wird immer nur der untere
Teil verwendet.

Das dachte ich auch, aber winavr hat aus meinem 32bit unsigned long 
gerade das highbyte nach unsigned gecastet. Sonst wäre ich schon 
feddisch. Mit dem unsigned char nach char hat es sich genauso 
schwachsinnig verhalten.


von Peter D. (peda)


Lesenswert?

Ralf wrote:

> Das dachte ich auch, aber winavr hat aus meinem 32bit unsigned long
> gerade das highbyte nach unsigned gecastet. Sonst wäre ich schon
> feddisch. Mit dem unsigned char nach char hat es sich genauso
> schwachsinnig verhalten.


Ja so ist das mit den Raterunden und Glaskugeln.

Hättest Du einfach mal den Quelltext gepostet, wie Du gecastet hast 
(nämlich nen Pointer !), dann hätten Dir auch alle gesagt, daß das nicht 
geht.


Peter


von Ralf (Gast)


Lesenswert?

...ich glaube gleich erwischst du mich g

es war kein pointer...es war ein element aus einem struct...sa ca so aus

test(unsigned a, char b)
{
}



void main (void)
{
struct xyz
    {
     unsigned long name;
     unsigned char adresse;
    };

test(yxz.name,xyz.adresse);
}


ja und in a stand dann das höchste byte von name drin...in b weiss ich 
gar nicht mehr.

von holger (Gast)


Lesenswert?

>test(yxz.name,xyz.adresse);

Und wo hast du dann gecastet ? Nirgends.
Und möglicherweise sogar a mit b vertauscht.

von Ralf (Gast)


Lesenswert?

>Und wo hast du dann gecastet ? Nirgends.
ich habe nicht expliziet gecastet...eigentlich bin ich von ausgegangen, 
dass winavr von  unsigned long nach unsigned impliziet castet...und da 
wie Philip schon sagte den unteren teil, wenn auf ein kleineren Datentyp 
gecastet wird. Das war aber eben nicht der fall.

exakt kam bei raus:

aus 0x00000001 wurde 0x0000
aber aus
0x00100000 wurde 0x0010

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.