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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.