Bedingte Prüfung auf „i == (2^8)“ schlägt fehl, wenn i 512 ist?
Lesezeit: 2 Minuten
Sandeep
Hier ist ein kleines Programm zum Drucken von Potenzen von 2 bis 8. Aber es beendet sich nicht nach 8. Bitte erklären Sie den Grund.
#include <stdio.h>
#include <unistd.h>
int main(void)
{
unsigned int i=1;
while(1) {
i = i<<1;
printf("i = %d\n",i);
if(i==(2^8))
break;
sleep(1);
}
printf("Exited While loop.. \n");
return 0;
}
Die Schleife wird nicht verlassen, wenn i = 2^8 ist. Meine Ausgabe sieht in etwa so aus:
i = 2
i = 4
i = 8
i = 16
i = 32
i = 64
i = 128
i = 256
i = 512 (Should have Exited here. But the program is continuing. Why?)
i = 1024
i = 2048
i = 4096....
BEARBEITEN :
Danke für die Antwort, dass ^ ein XOR-Operator ist. Aber jetzt verhält sich der folgende Code seltsam. Bitte erkläre.
Da es anscheinend alle nicht erwähnt haben, notiere ich es hier: in Sprachen, die es unterstützender Standardoperator zur Potenzierung ist das doppelte Sternchen, z. B. 28, 73 usw…
– Thomas
23. Juli 2012 um 12:00 Uhr
@Thomas Danke. Aber in C zeigt es einen Syntaxfehler.
– Sandeep
23. Juli 2012 um 12:05 Uhr
C ist keine dieser Sprachen. Es ist nur ein Bonus, falls Sie auf eine Sprache stoßen, die dies tut (Python, einige Pascal-Dialekte, vielleicht Java?)
– Thomas
23. Juli 2012 um 12:10 Uhr
In einigen Dialekten von Basic war ^ der Potenzierungsoperator. Ich kann mich jedoch nicht erinnern, es in anderen Sprachen gesehen zu haben.
– Ferruccio
23. Juli 2012 um 12:38 Uhr
+1 für eine häufig gestellte Frage, die den gesamten relevanten Quellcode und Beispiele für fehlerhafte Ausführung enthielt. Aber im Allgemeinen ist die Bearbeitung genau auf der Linie, wo es vielleicht besser gewesen wäre, eine neue Frage zu dem Rätsel zu stellen, da es wirklich keine Klärung ist Dies Frage.
– RBerteig
23. Juli 2012 um 18:53 Uhr
Guy Adini
In C bedeutet der Operator ^ XOR (bitwise exclusive or).
Um 2 hoch 8 zu erhalten, müssen Sie entweder eine Schleife verwenden (res *=2 in einer Schleife) oder die pow-Funktion in math.h runden (beachten Sie, dass die math.h-Funktion Float zurückgibt – und daher gewinnt’ t gleich der ganzen Zahl sein).
Die einfachste Methode ist natürlich die bitweise Verschiebung.
Über den Bearbeitungsbereich:
Willkommen in der wunderbaren Welt von Operator Vorrang. Was passiert ist, dass == einen höheren Vorrang als ^ hat und daher die Bedingung zu 2^0 ausgewertet wird, was 2 ist, was wahr ist.
Damit es funktioniert, müssen Sie Klammern hinzufügen:
if ( (2^8) == (1<<8) ) ...
Bitte schauen Sie sich meinen Abschnitt Bearbeiten in der Frage an.
– Sandeep
23. Juli 2012 um 7:21 Uhr
Vielen Dank. Es ist jetzt klar. Aber warum hat es 2 ^ 0 bewertet? selbst wenn es 2 ^ 0 ist, was 2 ist, wie gibt es 1 zurück, wenn es mit 1 verglichen wird?
– Sandeep
23. Juli 2012 um 7:35 Uhr
Nein nein, 8 == (1<<8) zu 0 ausgewertet, was dann mit 2 xored wurde, was zu 2 ausgewertet wurde. WAHR...".
– Guy Adini
23. Juli 2012 um 7:37 Uhr
“Beachten Sie, dass die Funktion math.h Float zurückgibt – und daher nicht gleich der Ganzzahl ist” Nein, pow(3) gibt ein Double zurück und ist daher für den gesamten Bereich einer 32-Bit-Ganzzahl (und die meisten auch einer 64-Bit-Ganzzahl) genau richtig.
– Benutzer79758
23. Juli 2012 um 9:39 Uhr
Felice Pollano
Das Problem ist, dass ^ ist der Bitweises XOR Betreiber, nicht an die Macht zu bringen. Lassen Sie uns erklären 2^8 im bitweisen Format:
2 = 0010
8 = 1000
======== xor
10= 1010
Das Ergebnis, wenn xor Bit für Bit angewendet wird, ist also 10, das passiert nie, sodass Ihre Schleife nie beendet wird. Sie können Ihren Komponententest zum Laufen bringen, wenn Sie verwenden pow(2,8) und stattdessen auf Ganzzahl runden.
Eine weitere Information, es ist in diesem Beispiel wahrscheinlich nicht der Fall, aber es ist besser, die strikte Gleichheit zu vermeiden, wenn Sie mit Gleitkommawerten arbeiten, vergleichen Sie besser mit einem Epsilon.
Für deine Bearbeitung:
Stellen Sie damit den Vorrang sicher:
if((2^8) == (1<<8))
dies wird wie erwartet false zurückgeben.
2^8 ist 2 XOR 8, dh. 10, nicht 256. Daher stoppt Ihre Schleife nicht. Sie möchten wahrscheinlich gegen beides prüfen (1<<8) oder 256 speziell.
Witzbold
^ ist keine Macht in c, heißt es XOR. 2^8==10 und es wird in diesem Code nicht gleich i sein.
^ ist bitweises XOR, die gesuchte Funktion ist pow in math.h 🙂
Da es anscheinend alle nicht erwähnt haben, notiere ich es hier: in Sprachen, die es unterstützender Standardoperator zur Potenzierung ist das doppelte Sternchen, z. B. 28, 73 usw…
– Thomas
23. Juli 2012 um 12:00 Uhr
@Thomas Danke. Aber in C zeigt es einen Syntaxfehler.
– Sandeep
23. Juli 2012 um 12:05 Uhr
C ist keine dieser Sprachen. Es ist nur ein Bonus, falls Sie auf eine Sprache stoßen, die dies tut (Python, einige Pascal-Dialekte, vielleicht Java?)
– Thomas
23. Juli 2012 um 12:10 Uhr
In einigen Dialekten von Basic war ^ der Potenzierungsoperator. Ich kann mich jedoch nicht erinnern, es in anderen Sprachen gesehen zu haben.
– Ferruccio
23. Juli 2012 um 12:38 Uhr
+1 für eine häufig gestellte Frage, die den gesamten relevanten Quellcode und Beispiele für fehlerhafte Ausführung enthielt. Aber im Allgemeinen ist die Bearbeitung genau auf der Linie, wo es vielleicht besser gewesen wäre, eine neue Frage zu dem Rätsel zu stellen, da es wirklich keine Klärung ist Dies Frage.
– RBerteig
23. Juli 2012 um 18:53 Uhr