Forum: Compiler & IDEs C Frage zu Reihenfolge von Operationen


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. (Gast)


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. (Gast)


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. (Gast)


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ää

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.