maßloser Speicherverbrauch bei int-Division

#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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren