typcast unsigned char nach char

Gast #538843
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
Gast #538863
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"



Gast #538865
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.

#538935
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

Gast #538938
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.
Gast #538999
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren