maßloser Speicherverbrauch bei int-Division

OP #3566010
Lesenswert?
• ▲
▼
Warum verbraucht dieses winzige AVR-Programm (z.B. atmega) mit einer 
simplen Ganzzahldivision so maßlos Programmspeicher? Es sind immerhin 
fast 5 kB.
1
int main(void) {
2
    volatile uint32_t i = 65;
3

4
    i = 3151872000 / i;
5
    while(1);
6
}

Der Wertebereich ist auf jeden Fall ausreichend. Sofern der Zähler aber 
eine Null weniger hat, normalisiert sich plötzlich der Speicherverbrauch 
halbwegs (264 B gesamt).

Ich bin sehr verwirrt. Wer kann die Sache aufklären?
Gast #3566422
Lesenswert?
• ▲
▼
F. P. schrieb:

> Der Wertebereich ist auf jeden Fall ausreichend.

Zu dumm, um aus dem Bus zu gucken...

Nein, der Wertebereich ist natürlich nicht ausreichend. Die obere Grenze 
für uint32_t ist 2^31-1, also 2.147.483.647. Jeder Klippschüler kann das 
(zumindest mit Hilfe eines Taschenrechners) ausrechnen...

3.151.872.000 ist jedenfalls deutlich größer...
Gast #3566429
Lesenswert?
• ▲
▼
c-hater schrieb:
> F. P. schrieb:
>
>> Der Wertebereich ist auf jeden Fall ausreichend.
>
> Zu dumm, um aus dem Bus zu gucken...
>
> Nein, der Wertebereich ist natürlich nicht ausreichend. Die obere Grenze
> für uint32_t ist 2^31-1, also 2.147.483.647. Jeder Klippschüler kann das
> (zumindest mit Hilfe eines Taschenrechners) ausrechnen...
>
> 3.151.872.000 ist jedenfalls deutlich größer...

Der Wertebereich von 32-Bit-Unsigned-Integer geht von
0 - 4.294.967.295

Scheisse, wenn man selber der Blödmann ist...
Persönliche Seite #3566787
Lesenswert?
• ▲
▼
Du machst eine 64-Bit Division, denn 3151872000 ist signed in C99 und 
passt wie bereits gesagt nicht in 32 Bits.

Die Signedness hat sich von C90 nach C99 geändert, in C90 war die 
Konstamte noch unsigned.

Du kannst die Konstante als unsigned machen, z.B. 3151872000UL. Die 
passt dann in 32 Bits und es wird dann eine 32-Bit Division.

Wenn du Code sparen willst dann lass das "volatile" weg. Dann rechnet 
der Compiler das aus und es kein Division in deinem Code. Dass ist 
dann noch kürzer als von Elm Chan.
#3566812
Lesenswert?
• ▲
▼
F. P. schrieb:
> Warum verbraucht dieses winzige AVR-Programm (z.B. atmega) mit einer
> simplen Ganzzahldivision so maßlos Programmspeicher?

Weil Du eine veraltete Lib benutzt.
Der WINAVR wird schon seit 2010 nicht mehr gepflegt, nimm was neueres.

Oder linke ne bessere 64Bit Lib hinzu:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=113673

Erst nach meinem Post fand die optimierte 64Bit-Lib auch Eingang in den 
AVR-GCC.
Persönliche Seite #3566856
Lesenswert?
• ▲
▼
Peter Dannegger schrieb:

> Weil Du eine veraltete Lib benutzt.

Nein, tut er nicht. Die im lss

Beitrag "Re: maßloser Speicherverbrauch bei int-Division"

gezeigten Routinen sind die aktuellen Routinen für 64-Bit Division.

> Der WINAVR wird schon seit 2010 nicht mehr gepflegt, nimm was neueres.

Hat er.

> Erst nach meinem Post fand die optimierte 64Bit-Lib auch Eingang in den
> AVR-GCC.

...was aber weder inhaltlich noch ursächlich mit diesem Post zu tun 
hat(te).

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.