Forum: Compiler & IDEs aus zwei 8bit zahlen einen 16bit zahl machen


von Basti S. (m3teor)


Lesenswert?

Hallo liebes Forum,

ich hab da mal eine Frage, und zwar.

Man kann ja aus einer 16bit zahl zwei 8bit zahlen machen.
z.B. so :
1
short _data = 0x1234;
2
    
3
unsigned char dataH = (unsigned char) (_data >> 8 & 0x00FF);
4
// jetzt steht in dataH 0x12
5
unsigned char dataL = (unsigned char) (_data  & 0x00FF);
6
// jetzt stecht in dataL 0x34

Aber wie kann ich jetzt aus zwei 8bit zahlen eine 16bit zahl machen.
z.B.:

1
char dataH = 0x12;
2
char dataL = 0x34;
3
  
4
short _data = dataH & dataL


also das in _data nach der Operation 0x1234 steht ?


Danke schon mal :)

von Peter II (Gast)


Lesenswert?

Basti S. schrieb:
> short _data = dataH & dataL

short _data = (dataH<<8) & dataL

von Yalu X. (yalu) (Moderator)


Lesenswert?

Peter II schrieb:
> short _data = (dataH<<8) & dataL

Aber mit einem | statt dem &.

von B. S. (bestucki)


Lesenswert?

Yalu X. schrieb:
> Peter II schrieb:
>> short _data = (dataH<<8) & dataL
>
> Aber mit einem | statt dem &.

Oder mit einem +. Natürlich muss _data vorher den Wert Null zugewiesen 
werden (egal ob mit | oder +).

von Oliver (Gast)


Lesenswert?

Und ewig grüsst das Murmeltier. Kann man die Frage nebst Antwort nicht 
mal in die FAQ aufnehmen? Die kommt ja nun mindestens einmal jede 
Woche...

Oliver

von Peter II (Gast)


Lesenswert?

Yalu X. schrieb:
> Peter II schrieb:
>> short _data = (dataH<<8) & dataL
>
> Aber mit einem | statt dem &.

danke für die Korrektur, hätte es doch selber schreiben sollen als zu 
korrigieren.

von Yalu X. (yalu) (Moderator)


Lesenswert?

be stucki schrieb:
> Oder mit einem +.

Ja, das ist in diesem Fall das Gleiche.

> Natürlich muss _data vorher den Wert Null zugewiesen werden (egal ob
> mit | oder +).

Nein, warum? Der Wert wird doch durch die obige Anweisung überschrieben.
Da spielt es keine Rolle, welchen Wert _data vorher hatte.

von B. S. (bestucki)


Lesenswert?

Yalu X. schrieb:
> Nein, warum? Der Wert wird doch durch die obige Anweisung überschrieben.
> Da spielt es keine Rolle, welchen Wert _data vorher hatte.

Ja, vergiss den Satz. Hatte gerade was anderes im Kopf...

von B. S. (bestucki)


Lesenswert?

Nochwas:
Wenn du einen Compiler verwendest, der nicht standardmässig alle 
Operationen mit int durchführt (z.B. XC8 von Microchip), dann ist noch 
ein Cast notwendig:
1
short _data = ((short)dataH << 8) | dataL;

von Di P. (drpepper) Benutzerseite


Lesenswert?

Wenn man Datentypen wie "uint16_t" oder "uint8_t" verwendet, dann weiß 
man auch direkt, welche Bitanzahl aufgenommen werden kann.

"int" ist bspw. auf verschiednen Achritekturen mit verschiedener Breite 
verfügbar.

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.