Forum: PC-Programmierung Problem beim Umrechnen


von Hanz (Gast)


Lesenswert?

Ich habe hier ein Problem beim Umrechnen einer short-Variable.

short value1;
short value2;


value1 = (((short)(buf[2])<<8) + ((short)(buf[3])));    //[2][3] 
//Luftfeuchte
value2 = (((short)(buf[4])<<8) + ((short)(buf[5])));    //[4]][5] 
//Temperatur

Diese zwei Werte, die ich von einem Mikrocontroller auf den PC 
übertragen habe, möchte ich nun umrechnen in eine physikalische Einheit 
und anschließend ausgeben.

RH = value1 * 100/ 2^14;
T = ((value2 * 165) / 2^16) - 40;

printf("T: %d     ", RH);
printf("RH: %d     ", T);

Bisher bekomme ich hierfür jedoch keine richtigen Ergebnisse. Was ist 
daran falsch? Ich habe leider recht wenig Erfahrung mit den 
verschiedenen Datentypen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Überleg' Dir mal, welcher Wertebereich Dir zur Verfügung steht, und wie 
groß die Kontanten sind, durch die Du da jeweils teilst.

von DirkB (Gast)


Lesenswert?

Hanz schrieb:
> RH = value1 * 100/ 2^14;
> T = ((value2 * 165) / 2^16) - 40;

Steht das bei dir so im Quelltext?
Das ^ ist Exclusiv-Oder und nicht hoch

Da ist es besser du schreibst die richtigen Konstanten hin: 8192 und 
65536

von Albert .. (albert-k)


Lesenswert?

Hanz schrieb:
> RH = value1 * 100/ 2^14;
> T = ((value2 * 165) / 2^16) - 40;

Wenn du damit sagen möchtes
 muss ich dich enttäuschen, der "^" Operator bedeutet nicht "Exponent" 
sondern XOR.

von Robert L. (lrlr)


Lesenswert?

(ob dass dann nicht auch eine intergerdivision ist, sollte man sich auch 
anschauen..)

von Yalu X. (yalu) (Moderator)


Lesenswert?

DirkB schrieb:
> Da ist es besser du schreibst die richtigen Konstanten hin: 8192 und
> 65536

Nee, so etwas lässt man besser den Compiler rechnen, zumal dieser auch
weniger Fehler macht (2¹⁴ ist 16384 und nicht 8192 ;-) ).

In diesem Fall
1
RH = value1 * 100/ 2^14;
2
T = ((value2 * 165) / 2^16) - 40;

würde ich aber einfach schreiben:
1
RH = value1 * 100 >> 14;
2
T = (value2 * 165 >> 16) - 40;

Bei der Extraktion von short-Werten aus den Pufferbytes hast du es ja
ebenso gemacht.

Übrigens würde ich in
1
value1 = (((short)(buf[2])<<8) + ((short)(buf[3])));
2
value2 = (((short)(buf[4])<<8) + ((short)(buf[5])));

ein paar der Klammern weglassen. Manchmal dienen Klammern der besseren
Übersichtlichkeit, zuviele verderben sie aber wieder. So viele hätten
gereicht:
1
value1 = (short)(buf[2]<<8) + (short)buf[3];
2
value2 = (short)(buf[4]<<8) + (short)buf[5];

von DirkB (Gast)


Lesenswert?

Yalu X. schrieb:
> Nee, so etwas lässt man besser den Compiler rechnen, zumal dieser auch
> weniger Fehler macht (2¹⁴ ist 16384 und nicht 8192 ;-) ).

In der Ecke schäm.

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.