Forum: Mikrocontroller und Digitale Elektronik C Frage an die Könner


von C Leghasteniker (Gast)


Lesenswert?

Hi,

Was tut das?

 30 #define RV3029C2_STATUS_VLOW1           (1 << 2)

von T.roll (Gast)


Lesenswert?

30 ist die Zeilennummer.

Zum restlichen: Hier ersetzt der Präprozessor sämtliche 
RV3029C2_STATUS_VLOW1 im Code durch (1 << 2).

von Obertroll (Gast)


Lesenswert?

T.roll schrieb:
> im Code durch (1 << 2)

und optimieret es zu 0x04

von C Leghasteniker (Gast)


Lesenswert?

Ok,

Und was macht dann 1<<2?

Danke

von Marco (Gast)


Lesenswert?

0x1 = 0b00000001 um 2 Stellen nach links  geshiftet ergibt 0b00000100 = 
0x4

von Mark B. (markbrandis)


Lesenswert?

C Leghasteniker schrieb:
> Ok,
>
> Und was macht dann 1<<2?


Das ist vom Ergebnis her einfach ein Literal.

http://de.wikipedia.org/wiki/Literal

Der Wert ist 4. Für sich alleine "macht" das gar nichts. Vermutlich wird 
dieser Wert irgendwo im Code einer Variablen zugewiesen, oder in einer 
Berechnung verwendet.

von T.roll (Gast)


Lesenswert?

Lesestoff: Bitmanipulation

von C Leghasteniker (Gast)


Lesenswert?

Dankeschön.

Einfach, wenn man es weiß;-)

von Korinthenkacker (Gast)


Lesenswert?

Obertroll schrieb:
> T.roll schrieb:
>> im Code durch (1 << 2)
>
> und optimieret es zu 0x04

Das wird nicht optimiert, sondern ausgerechnet.

KK

von Mark B. (markbrandis)


Lesenswert?

Korinthenkacker schrieb:
> Obertroll schrieb:
>> T.roll schrieb:
>>> im Code durch (1 << 2)
>>
>> und optimieret es zu 0x04
>
> Das wird nicht optimiert, sondern ausgerechnet.

Beim Kompilieren. Kann man so gesehen auch als Optimierung betrachten 
;-)

von Rolf Magnus (Gast)


Lesenswert?

Mark Brandis schrieb:
> C Leghasteniker schrieb:
>> Ok,
>>
>> Und was macht dann 1<<2?
>
> Das ist vom Ergebnis her einfach ein Literal.

Nein. Literale sind Werte, die direkt im Code stehen. 1 und 2 sind 
Literale. Das Ergebnis von 1<<2 dagegen nicht.

Mark Brandis schrieb:
> Korinthenkacker schrieb:
>> Obertroll schrieb:
>>> T.roll schrieb:
>>>> im Code durch (1 << 2)
>>>
>>> und optimieret es zu 0x04
>>
>> Das wird nicht optimiert, sondern ausgerechnet.
>
> Beim Kompilieren. Kann man so gesehen auch als Optimierung betrachten
> ;-)

Da es mehr oder weniger schon vom Compiler ausgerechnet werden muss 
würde ich nicht von Optimierung sprechen.

von Patrick (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Da es mehr oder weniger schon vom Compiler ausgerechnet werden muss

Wieso; wer sagt das? Wo steht, dass der Compiler das ausrechnen muss 
und nicht z. B. eine Zuweisung des Wertes "1" gefolgt von zwei 
Linksschiebeoperationen daraus macht?

von Marian (phiarc) Benutzerseite


Lesenswert?

Auf jeden Fall macht das nicht der CPP (C Pre Processor), der ersetzt 
das wirklich nur 1:1 und macht nichts mit den Werten.

von Rolf Magnus (Gast)


Lesenswert?

Patrick schrieb:
> Rolf Magnus schrieb:
>> Da es mehr oder weniger schon vom Compiler ausgerechnet werden muss
>
> Wieso; wer sagt das? Wo steht, dass der Compiler das ausrechnen muss
> und nicht z. B. eine Zuweisung des Wertes "1" gefolgt von zwei
> Linksschiebeoperationen daraus macht?

ISO C sagt zwar nicht, daß das so gemacht werden muß (deshalb auch "mehr 
oder weniger"), aber es sagt, daß 1<<2 eine "integer constant 
expression" ist und damit überall benutzt werden kann, wo eine Konstante 
möglich ist, also z.B. auch als Größe eines statischen Arrays.

von Cyblord -. (cyblord)


Lesenswert?

Patrick schrieb:
> Rolf Magnus schrieb:
>> Da es mehr oder weniger schon vom Compiler ausgerechnet werden muss
>
> Wieso; wer sagt das? Wo steht, dass der Compiler das ausrechnen *muss*
> und nicht z. B. eine Zuweisung des Wertes "1" gefolgt von zwei
> Linksschiebeoperationen daraus macht?

Mich würde interessieren ob es einen Compiler (oder eine Compileroption) 
gibt, welche eine zur Compilezeit bekannte Konstante, zur Laufzeit 
ausrechnet, und aus welchem Grund dies gemacht wird.

Danke für die Aufklärung.

gruß cyblord

von Karl H. (kbuchegg)


Lesenswert?

Option wäre eventuell möglich.
Aber abgesehen davon regelt das der Markt. Wenn ein C Compiler auf den 
Markt kommt, der die trivialste aller Optimierungen nicht beherrscht, 
Constant Folding, dann verschwindet der schneller wieder vom Markt als 
die Installation dauern würde.

von Marian (phiarc) Benutzerseite


Lesenswert?

cyblord ---- schrieb:
> Mich würde interessieren ob es einen Compiler (oder eine Compileroption)
> gibt, welche eine zur Compilezeit bekannte Konstante, zur Laufzeit
> ausrechnet, und aus welchem Grund dies gemacht wird.

Welchen Sinn hätte das denn? Wenn du den Wert wissen willst, ist es egal 
(printf oder C-kompatibler Taschenrechner, die gibt es wie Sand am Meer. 
Zsh und Emacs haben von denen auch das eine odere andere... dutzend 
eingebaut :D)

von Cyblord -. (cyblord)


Lesenswert?

Marian B. schrieb:
> cyblord ---- schrieb:
>> Mich würde interessieren ob es einen Compiler (oder eine Compileroption)
>> gibt, welche eine zur Compilezeit bekannte Konstante, zur Laufzeit
>> ausrechnet, und aus welchem Grund dies gemacht wird.
>
> Welchen Sinn hätte das denn?

Genau das möchte ich ja von Patrick wissen. Erzähl das nicht MIR!

Im Gegensatz zu diesem Vogel habe ich nicht angedeutet, nicht jeder 
Compiler würde Konstanten auch als Konstanten auffassen sondern von der 
Zielmaschine erst ausrechnen lassen.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

http://root.cern.ch/drupal/content/cint

Der sollte das zur Laufzeit ausrechnen müssen.

SCNR

von Cyblord -. (cyblord)


Lesenswert?

Walter Tarpan schrieb:
> http://root.cern.ch/drupal/content/cint
>
> Der sollte das zur Laufzeit ausrechnen müssen.

Ist ja auch ein Interpreter ;-) Aber Patrick kennt sicher auch noch 
einen Compiler. Wir warten einfach mal.

von Thomas E. (thomase)


Lesenswert?

Patrick schrieb:
> Rolf Magnus schrieb:
>> Da es mehr oder weniger schon vom Compiler ausgerechnet werden muss
>
> Wieso; wer sagt das? Wo steht, dass der Compiler das ausrechnen *muss*
> und nicht z. B. eine Zuweisung des Wertes "1" gefolgt von zwei
> Linksschiebeoperationen daraus macht?

Keine Ahnung, wo das steht. Aber Compilerbauer sind keine Vollidioten.

mfg.

von Mark B. (markbrandis)


Lesenswert?

Rolf Magnus schrieb:
> Mark Brandis schrieb:
>> C Leghasteniker schrieb:
>>> Ok,
>>>
>>> Und was macht dann 1<<2?
>>
>> Das ist vom Ergebnis her einfach ein Literal.
>
> Nein. Literale sind Werte, die direkt im Code stehen. 1 und 2 sind
> Literale. Das Ergebnis von 1<<2 dagegen nicht.

Meinetwegen steht die 4 als Literal nicht im C-Code, aber sie steht doch 
sicherlich im daraus erzeugten Assembler-Code. Spätestens dort ist sie 
dann ein Literal :-)

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

cyblord ---- schrieb:
> Mich würde interessieren ob es einen Compiler (oder eine Compileroption)
> gibt, welche eine zur Compilezeit bekannte Konstante, zur Laufzeit
> ausrechnet, und aus welchem Grund dies gemacht wird.

Im Fließkomma-Bereich in Kombination mit Cross-Compiling wird oft 
constant folding deaktiviert, da das Rundungsverhalten der Zielmaschine 
auf dem Compile-Host nicht bekannt ist.

Bekanntes Beispiel ist avr-gcc, der ohne -ffast-math auch kein (bzw. nur 
ein eingeschränktes) constant folding auf floats durchführt. (oder wars 
constant propagation?)

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Guter Einwand mit dem Floating Zeug. Da ist was dran.

Allerdings müsste man fragen, ob eine Formel im Code, welche auf 
unterschiedlichen Maschinen, zu unterschiedlichen Ergebnissen führt, 
überhaupt noch eine Konstante ist.

von Marian (phiarc) Benutzerseite


Lesenswert?

Durchaus, es gibt eben vier unterschiedliche, definierte 
Rundungsverhalten mit IEEE 754 Floats. Fließkommaarithmetik ist nicht 
exakt. Ist sie fast nie...

Der Compiler könnte allerdings durchaus den Rundungsmodus der 
Zielhardware kennen.

: Bearbeitet durch User
von Quack (Gast)


Lesenswert?

cyblord ---- schrieb:
> Genau das möchte ich ja von Patrick wissen. Erzähl das nicht MIR!

Warum stellst du dann nicht genau diese Frage?

> Im Gegensatz zu diesem Vogel habe ich nicht angedeutet,

Er hat nichts dergleichen angedeutet. Das findet mal wieder nur in 
deinem Kopf statt. Er hat lediglich gesagt, dass der Compiler das nicht 
tun muss. Wenn du anderer Meinung bist, dann zitiere doch einfach die 
passende Stelle aus dem Standard, statt hier wieder eine Show ab zu 
ziehen.

von Cyblord -. (cyblord)


Lesenswert?

Quack schrieb:
> cyblord ---- schrieb:
>> Genau das möchte ich ja von Patrick wissen. Erzähl das nicht MIR!
>
> Warum stellst du dann nicht genau diese Frage?
Habe ich doch getan.

von Andreas (Gast)


Lesenswert?

Naja,
wenn das Ausrechnen der Sinn des Programms selbst ist und recht lang 
dauert,
dann sollte das der Compiler nicht tun.
Also wenn Du ein Programm schreibst, dass Pi auf 100Mio Stellen 
ausrechnet,
dann moechtest Du nicht, dass der Compiler das macht, auch dann wenn der
Programmaufruf
PiAufNStellen(100000000);
ein konstanter Ausdruck waere.

Andreas

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

cyblord ---- schrieb:
> Allerdings müsste man fragen, ob eine Formel im Code, welche auf
> unterschiedlichen Maschinen, zu unterschiedlichen Ergebnissen führt,
> überhaupt noch eine Konstante ist.

es kommt (wie immer) darauf an. Diesen Kelch hab ich vor einigen Monaten 
schon herumgetragen (gabs sogar hier einen Thread dazu). Anfangs war ich 
begeistert von fast-math, weil es meinen Code signifikant verschnellert 
und verkleinert hat, allerdiings hab ich das auch gleich schnell wieder 
abgedreht, weil dann an anderen Stellen was nicht mehr funktioniert hat 
(irgendwas mit INF und/oder NAN oder so...)

Schlußendlich kann man den Compiler "bitten" doch etwas zu optimieren, 
es kommt auf die Reihenfolge und die Klammerung an.
1
double calc (double x) {
2
   return 3.14 * x / 2.0;
3
}
macht wirklich was da steht: 3.14 mit x multiplizieren und danach 
dividieren, man findet im asm-code danach wirklich einen fmul und einen 
fdiv-aufruf (oder wie immer diese lib-funktions heissen)

schreibt man aber:
1
return (3.14 / 2.0) * x;
dann hat man nur eine Multiplikation

Das Wissen um dieses Verhalten ist grad auf dem AVR nicht ganz unwichtig 
:-)

von Marian (phiarc) Benutzerseite


Lesenswert?

C++ hat diesen schönen Qualifier constexpr, der wäre in C imho auch 
sehr praktisch.

int x = readint();
constexpr double y = 3.141 * x; // kompiliert nicht

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.