mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik uint16 in uint8 schreiben


Autor: Großes Fragezeichen (112)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo nochmal

wenn ich einen volatile uint8_t Wert_1,
und dazu einen volatile uint16_t Wert_2 besitze,


kann ich dann mich darauf verlassen, dass ein Anweisung

Wert_1=Wert_2;

zuverlässig das HighByte oder das LowByte ignoriert ohne dabei im Rest 
meines Programms Unsinn anzustellen?

Wert_2 sind z.B. Millisekunden und sollen nur als Prüfwert an eine 1 
Byte Variable übergeben werden, um somit Pseudozufallszahlen als Prüfung 
zu erhalten

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es macht dem Zufall nichts aus, dass bis zu 65536 mögliche Werte in 
Wert_2 auf nur 256 mögliche Werte in Wert_1 abgebildet werden?

Ich schätze (*), dass wegen des volatile ein 16-Bit Lesezugriff auf die 
Variable Wert_2 erfolgt. Highbyte und Lowbyte von Wert_2 werden aber 
nicht geändert. Wenn doch eine Änderung erfolgt, dann vielleicht 
aufgrund eines parallel laufenden Interrupts mit Schreibzugriff. In 
diesem Fall sollte der Lesezugriff sowieso atomar erfolgen wie im 
Artikel Interrupt erklärt.

(*) Genau kann man das mit dem Disassemblerlisting klären.

Autor: pridul75 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist so:

uint8_t  Wert1;
uint16_t Wert2;


Bei der Zuweisung

Wert1 = Wert2;

wird nur das untere Byte übernommen.

Beispiel:

uint8_t Wert1;
uint16_t Wert2 = 256;

Wert1 = Wert2;

Wert1 ist dann 0.

(Bei 257 wäre Wert1 gleich 1 :-))


Das ganze nennt man implizite Zuweisung. Die C-Regeln führen dann zum 
oben beschriebenen Verhalten.

Schöner wäre es, Du würdest das Casting auch kenntlich machen:

Wert1 = (uint8_t)Wert2;

Dann wäre das auch für Dich in einiger Zeit noch klar, dass hier bei der
Zuweisung Informationen verloren gehen (können).
Manche Compiler meckern da auch (einfach mal höchste Warning-Stufe 
einschalten), was hilfreich ist, Fehler gleich zu Beginn zu finden.
Außerdem wäre es sinnvoll, wenn Du Deine Variablen Typzusätze im Namen 
hinzufügst.

Beispiel:

uint8_t Wert1_uint8;

Oder wie auch immer Du möchtest. Dann kannst Du ebenfalls schneller 
sehen,
was hier passiert.


Meine Musterlösung wäre dann irgendwie sowas:

uint8_t Wert1_uint8;
uint16_t Wert2_uint16 = 256;

Wert1_uint8 = (uint8_t)Wert2_uint16;


Ich selber nennen die Typen aber anders (u8, u16, u32, s8, s16, s32, 
usw.).

u8 Variable_u8;
u16 Variable_u16 = 256;

Variable_u8 = (u8)Variable_u16;


Und so weiter...

Autor: pridul75 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das heißt dann nebenbei "explizite Zuweisung".

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.