Forum: Compiler & IDEs C Frage zu Reihenfolge von Operationen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Mike (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Was bewirkt die folgende Code-Zeile: (A oder B?)

data <<= exponent + 2;
A: data = (data << exponent) + 2;
B: data = data << (exponent + 2);

Vollstänigkeitshalber, hier die ganze Funktion:
unsigned short mulaw_decode(unsigned char mulaw)
{ mulaw = ~mulaw;
  int sign = mulaw & 0x80;
  int exponent = (mulaw & 0x70) >> 4;
  int data = mulaw & 0x0f;
  data |= 0x10;
  data <<= 1;
  data += 1;
  data <<= exponent + 2;
  data -= 0x84;
  return (short)(sign == 0 ? data : -data);
}

: Verschoben durch Moderator
von Oliver S. (oliverso)


Bewertung
-3 lesenswert
nicht lesenswert
Was erwartest du denn?
Zumindest in diesem Fall ist die Antwort naheliegend und logisch.

Oliver

von Olly T. (twinpeaks)


Bewertung
5 lesenswert
nicht lesenswert

von Mike (Gast)


Bewertung
-6 lesenswert
nicht lesenswert
Ich habe eine kurze, simple Frage gestellt, wenn ich die Antwort wüsste, 
würde ich nicht fragen.

Wer nicht Antworten kann oder will, soll sich doch auch bitte seine 
Kommentare sparen.

Danke!

von A. S. (achs)


Bewertung
0 lesenswert
nicht lesenswert
Die ollys haben dir alle Infos gegeben. Eine Tabelle irgendwo hinheften, 
wenn Du fremden Code liest (den eigenen kann man klammern).

Und als Kontrolle: B

Sonst wären die 2 Zeilen darüber
data <<= 1+1;

von mh (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Was sich der Autor wohl bei der "return-Zeile" gedacht hat?

von A. S. (achs)


Bewertung
0 lesenswert
nicht lesenswert
mh schrieb:
> Was sich der Autor wohl bei der "return-Zeile" gedacht hat?

Was überrascht dich da?

von mh (Gast)


Bewertung
1 lesenswert
nicht lesenswert
A. S. schrieb:
> mh schrieb:
>> Was sich der Autor wohl bei der "return-Zeile" gedacht hat?
>
> Was überrascht dich da?

Da wird erst eine "explicit type conversion" durchgeführt und dann eine 
"implicit integer conversion":
int -> short -> unsigned short.
Auch, wenn der Rückgabewert den Typ short hätte, wäre der cast 
überflüssig, es sei denn man muss/möchte eine Warnung beseitigen. Aber 
er hat den Typ unsigned short, es würde also weiterhin eine Warnung 
geben.
<source>:11:10: warning: conversion to 'short unsigned int' from 'short int' may change the sign of the result [-Wsign-conversion]

   11 |   return (short)(sign == 0 ? data : -data);

      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Compiler returned: 0

von Mark B. (markbrandis)


Bewertung
-1 lesenswert
nicht lesenswert
A. S. schrieb:
> mh schrieb:
>> Was sich der Autor wohl bei der "return-Zeile" gedacht hat?
>
> Was überrascht dich da?

Die Deklaration bzw. der Cast des Rückgabewerts passt nicht mit der 
Deklaration der Funktion zusammen:

unsigned short mulaw_decode(unsigned char mulaw)
{
  return (short)(sign == 0 ? data : -data);
}

Wenn ich unsigned short deklariere, dann macht es doch keinen Sinn etwas 
vorzeichenbehaftetes zurückgeben zu wollen.

von A. S. (achs)


Bewertung
1 lesenswert
nicht lesenswert
mh schrieb:
> int -> short -> unsigned short.

Ich könnte mir vorstellen, dass der Zwischenschritt über short bei nicht 
2er Komplement notwendig ist. Aber ja, 2er-komplement-maschinen kann man 
das short vermutlich sparen

von mh (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
A. S. schrieb:
> mh schrieb:
>> int -> short -> unsigned short.
>
> Ich könnte mir vorstellen, dass der Zwischenschritt über short bei nicht
> 2er Komplement notwendig ist. Aber ja, 2er-komplement-maschinen kann man
> das short vermutlich sparen

Wenn ist das Gegenteil der Fall, es sei denn implementation-defined 
behaviour wird gezielt ausgenutzt.

von MiWi (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Mike schrieb:
> bitte seine
> Kommentare sparen

Frecher ungehobelter Lurchi.
Lurchi += frech | ungehobelt;

erklärt s das?

von Rolf M. (rmagnus)


Bewertung
-2 lesenswert
nicht lesenswert
Mike schrieb:
> Ich habe eine kurze, simple Frage gestellt,

Ja, eine, die so simpel ist, dass das Googeln nach der Antwort weniger 
Zeit als das Posten gekostet hätte…
Generell kannst du davon ausgehen, dass alle Arten von 
Zuweisungsoperatoren einen sehr niedrigen Rang haben.

von MiWi (Gast)


Bewertung
-3 lesenswert
nicht lesenswert
Rolf M. schrieb:
> Antwort

Guten Morgen RM.

von Mike (Gast)


Bewertung
1 lesenswert
nicht lesenswert
MiWi (Gast) schrieb
>Frecher ungehobelter Lurchi.
>
>Lurchi += frech | ungehobelt;
>erklärt s das?
=> Nein

Rolf M Schrieb:
>Ja, eine, die so simpel ist, dass das Googeln nach der Antwort weniger
>Zeit als das Posten gekostet hätte…

Vielen Dank an alle, für die rasche und direkte Hilfe!

von blub (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Also der ++ Operator ist ja immer zu erst dran. Schätze mal dass das für 
alle dieser Art gilt also (A)
Kompiliere mit -S dann kannst du den Assemblycode anschauen da siehste 
dann die Reihenfolge direkt.

von blub (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
https://en.cppreference.com/w/c/language/operator_precedence

O hab mich geirrt. Der =  Operator kommt als letztes ;)

von blub (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Hatte oben schon jemand geschrieben!

von MiWi (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
blub schrieb:
> Also

blub schrieb:
> O

blub schrieb:
> Hatte

Täätättää

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.