Forum: Mikrocontroller und Digitale Elektronik leichte c-frage


von Dieter (Gast)


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

von crazy horse (Gast)


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 :-)

von Matthias (Gast)


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

von crazy horse (Gast)


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.

von Andreas Haimberger (Gast)


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

von crazy horse (Gast)


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.

von Peter (Gast)


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

von Dieter (Gast)


Lesenswert?

danke jungs. ich werds mit high*256+low probieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.