Forum: Mikrocontroller und Digitale Elektronik SDCC 2.9.1 - 8051 - Integer Arithmetk in C


von Anton B. (rabis49)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

>    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?

von Stefan B. (forscher)


Lesenswert?

temp3 ist aber als unsigned int deklariert, und sollte niemals negativ 
werden. Das kann, wenn man mit dem Wert weiterrechnet, unerwartete 
Effekte geben.

von Anton B. (rabis49)


Lesenswert?

@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

von Anton B. (rabis49)


Lesenswert?

@rufus
Auskommentieren geht  nicht, temp2 stimmt nur, wenn die Zeile drin 
bleibt,
das hatte ich auch schon probiert ...

Rabis49

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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.

von Anton B. (rabis49)


Lesenswert?

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
Noch kein Account? Hier anmelden.