C Frage zu Reihenfolge von Operationen

Gast #6225906
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
}
Gast #6226086
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;
Gast #6226703
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
#6226750
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.
Gast #6226890
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.
Gast #6232934
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!
Gast #6234762
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.

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