Hallo ,
ich habe das Problem 2 Integer-Werte nicht addieren zu können.
hier der Codeausschnitt:
...
#include <at89x051.h>
#include <stdlib.h>
#include <stdio.h>
#include <serial_IO.h>
...
void Read_ScratchPad(void) {
unsigned int temp,temp1,temp2;
unsigned int temp3;
...
printf_fast(" temperature: +%3d °C\r\n", temp>>4);
printf_fast(">>%8d:",temp);
temp1 = temp;
temp1 = (temp*25)>>2;
printf_fast("%8d ",temp1);
temp1 =((temp*25)>>2)/100;
temp2 = temp1*100;
printf_fast("%8d ",temp2);
printf_fast("temperature: +%3d, °C",temp1);
temp3 = temp1 - temp2;
printf_fast(" N:%d ",temp3);
...
}
temp3 wird falsch ermittelt, und so bekomme ich die Nachkommastellen
nicht ausgegeben...
Hier die Ausgabe:
temperature: + 26 °C
>> 417: 2606 2600 temperature: + 26, °C N:-2574
Kennt sich wer mit SDCC aus und kann mir helfen die Krux zu lösen?
Dank derweil
Rabis49
> printf_fast("%8d ",temp2); > printf_fast("temperature: +%3d, °C",temp1); > temp3 = temp1 - temp2; > printf_fast(" N:%d ",temp3); Betrachte ich diesen Code und die drei letzten ausgegebenen Werte >> 417: 2606 2600 temperature: + 26, °C N:-2574 so stellt sich das für mich so dar: temp2 ist 2600 temp1 ist 26 temp3 ist temp1 - temp2 also 26 - 2600 Und das ist völlig korrekt -2574. Wo übrigens addierst Du in Deinem Codeschnipsel etwas?
temp3 ist aber als unsigned int deklariert, und sollte niemals negativ werden. Das kann, wenn man mit dem Wert weiterrechnet, unerwartete Effekte geben.
@forscher
okay, habe auf temp3 auf int geändert, das wars nicht, da ja 2606-2600 =
6 wäre.
@rufus
Dachte ich auch.
wenn ich die Zeile: temp1 =((temp*25)>>2)/100; auskommentiere
dann erhalte ich:
>> 437: 2731 10956 temperature: +2731, °C N:-8225
Upss, da ist die 31 aber woher, moment ...
Rabis49
@rufus Auskommentieren geht nicht, temp2 stimmt nur, wenn die Zeile drin bleibt, das hatte ich auch schon probiert ... Rabis49
> temp3 ist aber als unsigned int deklariert, und sollte niemals negativ > werden. Das mag wohl sein, Du aber instruierst printf() dazu, temp3 als signed int zu interpretieren (Formatspezifizierer %d). Versuchs mal mit %u.
So ist es richtig: printf_fast(" temperature: +%3d °C\r\n", temp>>4); printf_fast(">>%8d:",temp); temp1 = temp; temp1 = (temp*25)>>2; printf_fast("%8d ",temp1); temp1 =((temp*25)>>2)/100; temp2 = temp1*100; printf_fast("%8d ",temp2); printf_fast("temperature: +%3d,",temp1); temp3 = ((temp*25)>>2) - temp2; if (temp3<10) { printf_fast("0%d °C\r\n",temp3); } else { printf_fast("%d °C\r\n",temp3); } Danke für die Hilfe! Rabis49
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.