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)


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:
1
unsigned short mulaw_decode(unsigned char mulaw)
2
{ mulaw = ~mulaw;
3
  int sign = mulaw & 0x80;
4
  int exponent = (mulaw & 0x70) >> 4;
5
  int data = mulaw & 0x0f;
6
  data |= 0x10;
7
  data <<= 1;
8
  data += 1;
9
  data <<= exponent + 2;
10
  data -= 0x84;
11
  return (short)(sign == 0 ? data : -data);
12
}

: Verschoben durch Moderator
von Oliver S. (oliverso)


Lesenswert?

Was erwartest du denn?
Zumindest in diesem Fall ist die Antwort naheliegend und logisch.

Oliver

von Olly T. (twinpeaks)


Lesenswert?


von Mike (Gast)


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)


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)


Lesenswert?

Was sich der Autor wohl bei der "return-Zeile" gedacht hat?

von A. S. (achs)


Lesenswert?

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

Was überrascht dich da?

von mh (Gast)


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":
1
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.
1
<source>:11:10: warning: conversion to 'short unsigned int' from 'short int' may change the sign of the result [-Wsign-conversion]
2
3
   11 |   return (short)(sign == 0 ? data : -data);
4
5
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6
7
Compiler returned: 0

von Mark B. (markbrandis)


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)


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)


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)


Lesenswert?

Mike schrieb:
> bitte seine
> Kommentare sparen

Frecher ungehobelter Lurchi.
1
Lurchi += frech | ungehobelt;

erklärt s das?

von Rolf M. (rmagnus)


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)


Lesenswert?

Rolf M. schrieb:
> Antwort

Guten Morgen RM.

von Mike (Gast)


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)


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)


Lesenswert?

https://en.cppreference.com/w/c/language/operator_precedence

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

von blub (Gast)


Lesenswert?

Hatte oben schon jemand geschrieben!

von MiWi (Gast)


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]
  • [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.
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.

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