Forum: Compiler & IDEs "seltsames" Verhalten im if


von Fragender (Gast)


Lesenswert?

Folgendes Szenario:

32bit Controller.

1. c-File
1
unsigned char val1 = 0;
2
unsigned char val2 = 0xFF;

2. c-File
1
extern unsigned char val1;
2
extern unsigned char val2;
3
4
if (val1 == ~val2)
5
{ STATEMENT_1 } else {STATEMENT_2}


Nach Abarbeiten des if stell ich fest dass STATEMENT_2 erreicht wurde.
Gewünscht hätt ich mir natürlich STATEMENT_1.
Durch wildes rumgecaste kann ich das Problem beheben.

Kann mir wer sagen wo mein Denkfehler ist?
Ich hab eine Vermutung, will aber hier nicht vorgreifen :-)

von Pete K. (pete77)


Lesenswert?

Wie ist denn unsigned char bei Deinem unbekannten Compiler definiert?
Als 32bit? Dann reichen 0xFF wohl nicht.

: Bearbeitet durch User
von Kaj (Gast)


Lesenswert?

Einfach mal die Warnungen einschalten...
1
Warnung: comparison of promoted ~unsigned with unsigned [-Wsign-compare]
2
     if (val1 == ~val2) {
3
              ^~

von Yalu X. (yalu) (Moderator)


Lesenswert?

val1 = 0
~val2 = 0xffffff00

(wegen Integer-Promotion)

Edit: Vielleicht wolltest du schreiben:
1
  if (val1 == (unsigned char)~val2)
2
    ...

Damit verschwindet auch die Warnung des Compilers.

: Bearbeitet durch Moderator
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Fragender schrieb:
>
1
> if (val1 == ~val2)
2
> { STATEMENT_1 } else {STATEMENT_2}
3
>

Kannst du vereinfachen zu:
1
{STATEMENT_2}

denn der 1. Zweig wird nie ausgeführt da die Bedingung immer false ist.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Johann L. schrieb:
>> if (val1 == ~val2)
>> { STATEMENT_1 } else {STATEMENT_2}
>>
> Kannst du vereinfachen zu:
> {STATEMENT_2}
> denn der 1. Zweig wird nie ausgeführt da die Bedingung immer false ist.

Sollte man Optimierungen nicht lieber dem Compiler überlassen? ;-)

von Rolf M. (rmagnus)


Lesenswert?

Yalu X. schrieb:
> Sollte man Optimierungen nicht lieber dem Compiler überlassen? ;-)

Naja, man muss ja nicht unbedingt zusätzliche unnötige Dinge einbauen, 
nur damit der Optimizer was zu tun hat.

von Carl D. (jcw2)


Lesenswert?

Rolf M. schrieb:
> Yalu X. schrieb:
>> Sollte man Optimierungen nicht lieber dem Compiler überlassen? ;-)
>
> Naja, man muss ja nicht unbedingt zusätzliche unnötige Dinge einbauen,
> nur damit der Optimizer was zu tun hat.

Vielleicht hat man ja eine Source für 2 verschiedene Hardware-Versionen, 
dann ist es doch schön wenn der Compiler den nicht benötigten Teil 
rückstandsfrei entsorgt. Wenn z.B. die Datenpins eines LCD entweder 
nebeneinander am selben Port, oder wild verstreuht vorliegen und im 
ersten Fall offensichtlich eine optimierte Implementierung möglich ist.

Und nein, der Preprocesser ist nicht für alles die richtige Lösung.

von Nop (Gast)


Lesenswert?

Carl D. schrieb:

> Und nein, der Preprocesser ist nicht für alles die richtige Lösung.

Wie jetzt, ich dachte, der sei Turing-vollständig? ;-)

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.