signed int zahlen teilen

#1792563
Lesenswert?
• ▲
▼
Bernd Schuster schrieb:

> z.B.
>
1
> signed int erg, zahl1, zahl2;
2
> 
3
> zahl1 = 0xFFF42A00;
4
> zahl2 = 0x001CEF80
5
> 
6
> erg = zahl1 / zahl2;
7
> 
8
>
>

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.
Gast #1792629
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.
#1792718
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.
#1792725
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.