www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik typcast unsigned char nach char


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ale (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"




Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>test(yxz.name,xyz.adresse);

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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.