Die Tücken von C

  • Hallo,

    hier mal wieder einer aus der Rubrik "Das kann doch nicht wahr sein".
    Ich wollte eine dword variable mit 10 multiplizieren (erg2 = 10*erg2). Dabei wird aber die ansic-Library mit dem protocol 1.008 eingebunden, so dass das Programm nicht mehr unter BBX 4.13 läuft. Das kann man zwar mit einem platform statement (platform geos21) in der GP fixen, aber das wollte ich nicht.

    Also habe ich gedacht: 10 = 8 + 2 und Multiplikation mit Acht oder Zwei lässt sich mit Shift-Operationen auch (und ggf sogar schneller) erledigen.

    Code
    erg2 = erg2<<3 + ergs<<1;	// erg2*8 + erg2*2 = erg2 * 10

    Pustekuchen, es kam totaler Müll heraus.

    ... eine halbe Stunde später mit swat und etwas Test-Code ...

    x, y und erg2 werden richtig berechnet, z aber nicht.

    ... noch ne halbe Stunde später ... die Erleuchtung. Der Plus-Operator ist in C höher priorisiert als '<<'. Der Compiler wertet den Ausdruck also so aus:

    Code
    z = (erg2<<(3 + erg2))<<1;

    Uns so gehts dann wie gewünscht:

    Code
    z = (erg2<<3) + (erg2<<1);

    Wer kommt denn von selbst auf sowas?

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.