Funktioniert das in c(nicht c++) if (r * 8 > 32768 || r * 8 < -32768) { } als WENN r 8 GRÖßER ALS 32768 ODER r 8 KLEINER ALS -32768 oder heißt das || in c etwas anderes?
Dumme Formatierung. Soll heißen WENN r MAL 8 GRÖßER ALS 32768 ODER r MAL 8 KLEINER ALS -32768
Das ist einfach nur Augenkrebs. Ich hab jetzt keine Lust die Reihenfolge der Operatoren auszutüfteln. Der liebe Gott hat runde Klammern erfunden also NUTZE sie auch. Gruß Marius
Rumschreien (Versalien, also alles in Großbuchstaben) hilft nicht. Sieh Dir die Operatorenvorrangregeln an, oder klammere Deine Ausdrücke. Sag dem Compiler, was Du erreichen willst.
1 | if ((r * 8 > 32768) || (r * 8 < -32768)) |
Ansonsten hängt das davon ab, wie groß ein int auf Deinem System ist, und welchen Datentyp r hat. Zur Sicherheit solltest Du die Konstanten als long kennzeichnen:
1 | if ((r * 8 > 32768L) || (r * 8 < -32768L)) |
Auf einem 16-Bit-System ist 32768 nicht mit einem int darstellbar, der Wertebereich geht von -32768 bis +32767.
Marius Wensing schrieb: > Der liebe Gott hat runde Klammern erfunden also NUTZE sie auch. Geschmackssache. Man kann sich auch merken, dass Vergleiche in C einen höheren Vorrang haben als logische Verknüpfungen, eben weil es gewollt ist, dass
1 | if (a > b && a < c) { |
2 | // ...
|
3 | }
|
so funktioniert, wie man es erwarten würde. In Pascal geht es übrigens nicht ohne Klammern ab. Ansonsten ist das eine Frage, wie groß der Wertebereich des Typs "int" auf der Zielplattform ist, ob das Ganze so funktioniert, wie man es erwarten würde.
Abendgedanken.
Marius Wensing schrieb:
> Der liebe Gott hat runde Klammern erfunden also NUTZE sie auch.
Das glaub ich so nicht ganz.
Kontra:
Der graue Alte hat nix erfunden, er hats hervorgezaubert.
Dieser Umstand schränkt die Patentierbarkeit auch deutlich ein.
Der Mensch kann etwas erfinden, vorallem wegen der fehlenden Fähigkeit
im Zaubern und weil der Mensch auch recht gut im Kopieren natürlicher
Begebenheiten ist.
Pro:
Allerdings beschreibt der Reiseführer des alten Grauen ein notwendiges
Ausklammern anderer Reisegruppen.
Rufus Τ. Firefly schrieb: > Zur Sicherheit solltest Du die Konstanten als long kennzeichnen: > if ((r * 8 > 32768L) || (r * 8 < -32768L)) Das bringt nichts. Wenn r vom Typ int ist, ist r * 8 auch ein int. Erst danach wird dann erweiteret auf long, weil rechts ein long steht. Da ist's aber schon zu spät. Also wenn, dann:
1 | if ((r * 8L > 32768) || (r * 8L < -32768)) |
oder das gleich ganz umgehen und einfach:
1 | if ((r > 32768 / 8) || (r < -32768 / 8)) |
Hmm.
> if ((r > 32768 / 8)
Wenn tatsächlich mit 32768 gearbeitet werden soll (mit int16_t nicht
darstellbar), dann ist die Aufgabenstellung natürlich trivial, da das
ein glatter Bruch ist. Und damit reduziert sich die Betrachtung auf
1 | if ((r > 4096) || (r < -4096)) |
Rufus Τ. Firefly schrieb: >> if ((r > 32768 / 8) > > Wenn tatsächlich mit 32768 gearbeitet werden soll (mit int16_t nicht > darstellbar), Na und? Wenn es nicht in rein passt wird eben der nächst größere Typ genommen. in
1 | long l = 65536; |
ist l 65536 und nicht 0, auch wenn int nur 16 Bits hat.
@Pete: Während sich die C Urgesteine in die Details ihrer Programmiersprache vertiefen.... Ist denn Deine Frage beantwortet? Fall nicht: Der Ausdruck ist wahr, wenn nur der linke, nur der rechte oder beide Vergleiche zutreffen. Du hast das schon richtig verstanden.
Na ja. Seine Frage zielte eigentlich darauf hin ab, sicher zu gehen, dass || in C ein logisches Oder ist. Da man das in jedem noch so grindigem C-Buch nachlesen kann, kann man auf die Idee kommen, dass sein eigentliches Problem nicht in der Bedeutung des || zu suchen ist, sondern in der Fragestellung, warum dieser Vergleich bei bekanntem Wert von r nicht wie erwartet funktioniert. Und dann ist der Schritt hin zu falschen Ergebnissen aufgrund von Overflows nicht mehr sehr weit. Zumal das Wissen darüber im Regelfall wesentlich weniger umfangreich ist, als das Wissen darüber welche Operation ein || eigentlich darstellt. Zumal jemand, der über die Overflow-Problematik Bescheid weiß, eher selten
1 | r * 8 > 32768 |
schreiben würde, sondern die Formulierung
1 | r > 32768 / 8 |
wahrscheinlich bevorzugen würde.
:
Bearbeitet durch User
Karl Heinz schrieb: > sondern die Formulierung r > 32768 / 8 > wahrscheinlich bevorzugen würde. Eben: > Und damit reduziert sich die Betrachtung auf > if ((r > 4096) || (r < -4096))
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.