C Frage zu Reihenfolge von Operationen

Gast #6225906
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
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!
Gast
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
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
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
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
Gast
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
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
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

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.