www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik signed int zahlen teilen


Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hab grad Schwierigkeiten zwei Werte (signed int) zu teilen -> als 
Ergebnis kommt immer 0x00 raus :-(


z.B.
signed int erg, zahl1, zahl2; 

zahl1 = 0xFFF42A00; 
zahl2 = 0x001CEF80

erg = zahl1 / zahl2;  


Gruß
Bernd

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Schuster schrieb:

> z.B.
>
> signed int erg, zahl1, zahl2;
> 
> zahl1 = 0xFFF42A00;
> zahl2 = 0x001CEF80
> 
> erg = zahl1 / zahl2;
> 
> 
>

Auf einem AVR?

dir ist klar dass ein int auf einem AVR nur 16 Bit hat? 0xFFF42A00 ist 
von daher schon viel zu groß dafür.

Bei der Zuweisung wird daher 0xFFF42A00 zu 0x2A00
und 0x001CEF80 wird zu 0xEF80

Dezimal geschrieben: 10752 / -4224

Das müsste also eigentlich -2 ergeben
Wie gibst du das Ergebnis aus, bzw. woher weißt du, dass da 0 
herauskommt.

PS: das signed brauchst du nicht schreiben. int alleine tuts auch, und 
ist dann signed.

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das im erg 0x00 steht, sagt mir die Variable beim Debuggen.

Arbeite auf einem SMT32 (also mit 32Bit-Werten). Beim Keil Compiler muss 
signed geschrieben werden, da int alleine unsigned int entspricht.

Gruß
Bernd

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist doch alles richtig. Der Dividend 0xFFF42A00 entspricht -(0x000BD600) 
und ist damit (vom Betrag her) kleiner als der Divisor 0x001CEF80. Also 
kommt 0 heraus (bzw. -0 ;) )

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab den fehler gefunden -> man müsste hier float oder double verwenden, 
wei das erg kleiner als null ist....

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Schuster schrieb:
> hab den fehler gefunden -> man müsste hier float oder double verwenden,
> wei das erg kleiner als null ist....

Nicht weril das Ergebnis kleiner 0 ist (-5 ist auch kleiner 0), sondern 
weil Du mit integer keine Bruchteile von ganzen Zahlen darstellen 
kannst.
Wichtig: der "geteilt"  Operator '/' rundet nicht sondern schneidet 
einfach ab, also 100 / 102 ist nicht 1 sondern 0.
Um Runden zu können musst Du das entweder mit dem % Operator zu Fuss 
machen oder Float benutzen und dann runden.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Schuster schrieb:
> hab den fehler gefunden -> man müsste hier float oder double verwenden,
> wei das erg kleiner als null ist....

Man müsste sich im Vorfeld besser überlegen was da eigentlich berechnet 
wird. Pauschal zu sagen "float oder double ist die Lösung" bedeutet oft 
nur vom Regen in die Traufe zu fallen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Schuster schrieb:

> Beim Keil Compiler muss
> signed geschrieben werden, da int alleine unsigned int entspricht.

Extrem unwahrscheinlich.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Beim Keil Compiler muss signed geschrieben werden,
>> da int alleine unsigned int entspricht.
Hast du dir mal an den chars die Finger verbrannt, und nimmst jetzt 
auch bei integer die feuerfesten Handschuhe (den Signed-Cast)?

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Schuster schrieb:
> Beim Keil Compiler muss
> signed geschrieben werden, da int alleine unsigned int entspricht.

Dann ist es kein C-Compiler.

vorausgeetzt wir sprechen doch über C:
auch sollte man die verwendung von int vermeiden.
es gibt eine headerdatei: stdint.h
die enthält typdefinitionen, die eine klar definierte signedness und 
Breite (--> Wertebereich) haben.
zB:
uint8_t
int8_t
uint32_t

da nimmt man dann das, was man wirklich braucht.
in deinem Falle (FFF42A00) ein 32bit typen und nicht einen Typ int, der 
auf von dem einen System/Compiler als 32bit, von einem anderen als 16bit 
definiert wird.

Auf kleinen µCs haben Floats und erst recht Doubles in der Regel nichts 
verloren.
Es gibt nur sehr wenige Anwendungsfälle wo man sowas wirklich braucht.
normalerweise hat man klare Vorstellungen von Wertebereich und man kann 
mit Fixpoint rechnen. das ist um den Faktor 100-200 schneller als eine 
SW-Float-Implementierung und belegt nur einen Bruchtteil des 
Programmspeichers.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vlad Tepesch schrieb:

> auch sollte man die verwendung von int vermeiden.

Wenn man etwas ganz bestimmtes damit vorhat, dann ja. Immer uint8_t für 
Daten zu verwenden, die nur 8 Bit haben müssen, ist allerdings nicht 
selten ineffizient. Wer nun wirklich konsequent ist, der verwendet 
folglich uint_fast8_t, aber Hand auf's Herz: Wie oft hast du das schon 
gesehen?

> Auf kleinen µCs haben Floats und erst recht Doubles in der Regel nichts
> verloren.

Auch das ist in dieser Verallgemeinerung unberechtigt. Man sollte sich 
den Einsatz gut überlegen, aber wenn es der Sache dient, nicht zu einlig 
ist und die Laufzeitfunktionen Platz finden, warum nicht?

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.