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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Anton B. (rabis49)


Bewertung
0 lesenswert
nicht 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) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

Rabis49

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.