Keine Checkung bei Bit-Shift
-
Bashar schrieb:
Ich wüsste jetzt aber auch kein System, wo das zu echten Problemen führt ..
Das System ist der Inhalt meines Wirsings( Rübe, Omme, Kopf
),
das versucht hat groovmasters MSB Invertierung nachzuvollziehen.
Dachte mir erst, ha !, das unsigned int casting kann man auch weglassen aber
Pustekuchen
Wusste eben nicht, das der Compiler von Haus aus von rechts einsen nachschiebt der Hund, dachte shiften nach rechts zieht immer Nullen nach.
-
proggingmania schrieb:
Bei meinem Compiler ist es so, das
printf("%d\n", UINT_MAX == ~0 );
printf("%d\n", -1 == ~0 );
Beides eine wahre Aussage liefert,
also ~0 zu 100% positiv
und
~0 zu 100% negativ ist.das ist kein widerspruch.
die x^y verschiedenen kombinationen eines datenworts werden für unterschiedliche zahlenbereiche benutzt. im einen fall von 0...UINT_MAX (vorzeichenlos) und von INT_MIN...INT_MAX (mit vorzeichen). dabei kommt's vor, dass die selbe bitkombination mehrere bedeutungen hat.
proggingmania schrieb:
Wusste eben nicht, das der Compiler von Haus aus von rechts einsen nachschiebt der Hund, dachte shiften nach rechts zieht immer Nullen nach.
es gibt auch programmmiersprachen (z.b. Java) mit zwei rechts-shift operatoren. einer schiebt nullen rein und einer einsen. da ist dann nix undefiniert
-
proggingmania schrieb:
Bei meinem Compiler ist es so, das
printf("%d\n", UINT_MAX == ~0 );
printf("%d\n", -1 == ~0 );Beides eine wahre Aussage liefert,
also ~0 zu 100% positiv
und
~0 zu 100% negativ ist.Du musst die Datentypen und Konvertierungen bedenken. Beim ersten Vergleich wird ~0 von int nach unsigned int umgewandelt.
-
Bashar schrieb:
Du musst die Datentypen und Konvertierungen bedenken. Beim ersten Vergleich wird ~0 von int nach unsigned int umgewandelt.
Das scheint den Compiler nicht so zu kratzen, weil der auch
printf("%d\n", UINT_MAX == (int)~0 );
als wahr ansieht.
Aber das ist ja auch ok.
~0 ist halt beides, -1 und UINT_MAX.Mein Problem war halt die Unwissenheit, das negative Zahlen nach dem Rechtsshiften von links einsen nachziehen.
-
proggingmania schrieb:
Das scheint den Compiler nicht so zu kratzen, weil der auch
printf("%d\n", UINT_MAX == (int)~0 );
als wahr ansieht.Ich wüßte auch nicht, warum ihn das kratzen sollte, wenn du den int ~0 nochmal nach int castest, bevor er nach unsigned konvertiert wird.
-
Bashar schrieb:
Ich wüßte auch nicht, warum ihn das kratzen sollte, wenn du den int ~0 nochmal nach int castest, bevor er nach unsigned konvertiert wird.
Der kann sich doch nicht einfach erdreisten, meinen nach (int) gecasteten Wert wieder intern nach ( unsigned int ) zurückzuwandeln ? Mit welchem Recht ?
-
proggingmania schrieb:
Bashar schrieb:
Ich wüßte auch nicht, warum ihn das kratzen sollte, wenn du den int ~0 nochmal nach int castest, bevor er nach unsigned konvertiert wird.
Der kann sich doch nicht einfach erdreisten, meinen nach (int) gecasteten Wert wieder intern nach ( unsigned int ) zurückzuwandeln ? Mit welchem Recht ?
Mit den Integer-Promotions-Regeln. Siehe C-Standard
-
proggingmania schrieb:
Der kann sich doch nicht einfach erdreisten, meinen nach (int) gecasteten Wert wieder intern nach ( unsigned int ) zurückzuwandeln ? Mit welchem Recht ?
Siehe rüdiger, aber nochwas dazu: Es interessiert ihn nicht, ob du irgendwas gecastet hast. Er sieht einen Vergleich zwischen unsigned int und int, und um den durchführen zu können, muss er beide Seiten auf einen gemeinsamen Typ bringen. Das ist in dem Fall eben unsigned int.
-
Bashar schrieb:
Er sieht einen Vergleich zwischen unsigned int und int, und um den durchführen zu können, muss er beide Seiten auf einen gemeinsamen Typ bringen.
...und wenn man den warning level höher stellt, zeigt ein freundlicher compiler auch an, dass man signed mit unsigned vergleicht (was auf einen fehler hinweisen könnte).
-
Bashar schrieb:
Siehe rüdiger, aber nochwas dazu: Es interessiert ihn nicht, ob du irgendwas gecastet hast. Er sieht einen Vergleich zwischen unsigned int und int, und um den durchführen zu können, muss er beide Seiten auf einen gemeinsamen Typ bringen. Das ist in dem Fall eben unsigned int.
Wenn er 1 == -1
sieht, macht er aus der -1 einen unsigned int ?
Das raff ich nicht.
-
proggingmania schrieb:
Wenn er 1 == -1
sieht, macht er aus der -1 einen unsigned int ?nein, macht er nicht. da muss nichts umgewandelt werden, weil beide 'int' sind.
wenn du eine zahl einfach so hinschreibst, ohne type cast oder irgendwelche anhängsel, ist es immer 'int'
-
pale dog schrieb:
...
nein, macht er nicht. da muss nichts umgewandelt werden, weil beide 'int' sind.
wenn du eine zahl einfach so hinschreibst, ohne type cast oder irgendwelche anhängsel, ist es immer 'int'
Ok und wenn ich nun hab
unsigned int i = 1
und int j = -1
Jetzt vergleiche ich beide i == j
So, warum muss jetzt j nach unsigned int konvertiert werden ?
-
Ok, ist klar jetzt, hat sich erledigt.
Das Licht ist aufgegagen
Ein Fall, fast so schwer wie 'The Story Of EOF',
hat sich aber gelohnt, jetzt komm ich wenigstens
mit dieser shifterei klar.MfG
-
pale dog schrieb:
wenn du eine zahl einfach so hinschreibst, ohne type cast oder irgendwelche anhängsel, ist es immer 'int'
Gar nicht.
-
PrOgGiNgMaNiA_ schrieb:
pale dog schrieb:
wenn du eine zahl einfach so hinschreibst, ohne type cast oder irgendwelche anhängsel, ist es immer 'int'
Gar nicht.
wieso nicht?
-
Weil sie möglicherweise nicht in einen int reinpassen könnte
(afair hat ein Ganzzahl-Literal den ersten Typ aus 'int', 'unsigned int', 'long', 'unsigned long', der groß genug ist, um den Wert unterzubringen)
-
d.h. bei einem 'long x = 123456;' wird automatisch 'long' genommen?
...und ich trottel schreib immer ein 'L' hinten dran.
-
Nicht direkt - der Wert 123456 ist idR klein genug, um als int durchzugehen, also hast du da eine int-Konstante (aber die kannst du bedenkenlos deiner long-Variable zuweisen, weil long NIE kleiner ist als int).
-
CStoll schrieb:
Nicht direkt - der Wert 123456 ist idR klein genug, um als int durchzugehen...
denkste. ich progge meistens für 16-bitter
-
Ich wusste gar nicht, das mein Compiler so blöd ist und bei Vergleichen der Art
2147483649 == -2147483647
eine wahre Aussage liefert.
Also das finde ich schon ganz schön heftig.