mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik leichte c-frage


Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab zwei 8bit-register (low und high). da drin steht ein 16 bit
wert.
wie bekomm ich den in eine integervariable?

und zwar in C?

bestimmt leicht, hab ich aber noch nie gemacht, und ich lern doch durch
doing und probiering. :)

danke im voraus.
gruß
dieter

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der "offizielle" Weg: ergebnis=256*high_byte + low_byte.
Allerdings gilt es dabei aufzupassen, meiner Erfahrung nach arbeiten
Compiler da verschieden, da die Operanden 8-Bit-Variablen sind, kann es
sein, dass erst mit nur 8bit gerechnet wird, anschliessend der
16bit-Variable zugewiesen wird, das Ergebnis ist dann natürlich falsch.
Abhilfe schafft dann der int-operator, dann wird auf jeden Fall mit
16bit gerechnet.
Statt der Multiplikation mit 256 kann natürlich auch 8faches schieben
nach links benutzt werden (high_byte<<8), ist auf jeden Fall viel
schneller.
Mit pointern gehts noch eleganter, aber das mach mal später :-)

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

x*256 wird vom Compiler eh als <<8 ausgeführt.

intvar=(unsigned int)highc<<8|lowc;

Die Addition kann man sich an dieser Stelle sparen und auf ein
logisched oder zurückführen. Das ganze sollte vom Compiler auf wenige
Befehle (idealerweise 2, sofern alle Werte in Registern stehen)
reduzieren.

Matthias

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ob ich addiere oder ein "oder" durchführe, dürfte kaum einen
Unterschied machen.
Aber ob der Compiler *256 automatisch durch <<8 ersetzt? Werde ich
gleich mal probieren, glaube ich eigentlich nicht.

Autor: Andreas Haimberger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//Zwei 8bit-Werte zu einem 16bit-Wert kombinieren:

void main(void)
  {
    union kombi
    {
      unsigned char byte[2];
      unsigned int word;
    } i;

    unsigned int zahl;
    unsigned char lowbyte = 100;
    unsigned char highbyte = 50;

    i.byte[0] = lowbyte;
    i.byte[1] = highbyte;
    zahl = i.word; //Zahl hat den Wert 12900
  }

//Grüße, Andy

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@andi: der ist gut!
ich habs sonst in der Art:
word=byte_low;
*(ptr+1)=byte_high;
Deine Lösung gefällt mir aber besser.

@matthias
Der Compiler ersetzt *256 tatsächlich.
Addition/Oder ist Jacke wie Hose, zwar anderer Code (logisch), aber
gleiche Grösse und gleich Taktzahl.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich würde einfach high*256+low nehmen.
Andys Lösung sieht zwar toll und schnell aus, aber das täuscht.
Die geht immer über das SRAM (wie die tricks mit Zeigern auch) und der
Compiler kann das nicht optimieren selbst wenn genug register frei
sind.

Peter

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke jungs. ich werds mit high*256+low probieren.

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.