Offensichtlich schaltet es nicht richtig. Aber in dem Buch, das ich gerade lese, heißt es:
Auf einer Maschine führt dieser Ausdruck tatsächlich eine Linksverschiebung von 27 Bit aus
Meine Frage ist; warum? Was verursacht eine Linksverschiebung von 27 Bit? Und was genau passiert beim Schalten mit negativer Schaltzahl? Vielen Dank.
Beachten Sie, dass das Verhalten tatsächlich undefiniertes Verhalten ist, Sie können sich nicht darauf verlassen, dass es Modulo 32 funktioniert. Zum Beispiel.
– Benutzer202729
26. März 2018 um 6:14 Uhr
Lundin
Negative ganze Zahlen auf der rechten Seite sind undefiniertes Verhalten in der C-Sprache.
ISO 9899:2011 6.5.7 Bitweise Verschiebungsoperatoren:
Die ganzzahligen Heraufstufungen werden an jedem der Operanden durchgeführt. Der Typ des Ergebnisses ist der des heraufgestuften linken Operanden. Wenn der Wert des rechten Operanden negativ ist oder größer oder gleich der Breite des hochgestuften linken Operanden ist, Das Verhalten ist undefiniert.
Übrigens, wenn Ihr Buch nicht erwähnt, dass dies ein undefiniertes Verhalten ist, sollten Sie in Betracht ziehen, ein anderes Buch zu kaufen.
– Ludin
9. Februar 2011 um 13:54 Uhr
Je nachdem, was das Buch sonst noch sagt, könnte man argumentieren, dass es genau das ist, was es sagt (obwohl es klarer sein könnte). „Auf einer Maschine passiert etwas“ bedeutet implizit, dass es auf anderen möglicherweise nicht passiert.
– 3 Dublonen
17. Februar 2011 um 3:57 Uhr
Wenn dies nicht funktioniert, wäre es eine Operation, die dem gewünschten Verhalten in der Frage entspricht? Scheint irgendwie traurig zu sein, eine Gleichung für diese spezielle Operation geschrieben zu haben: (. Ich versuche, eine Rechtsverschiebung vorzunehmen, die 1 zu 0 macht.
– Patrick
11. Februar 2015 um 15:46 Uhr
Was ist die Begründung für undefiniert statt Implementierung definiert hier? Löst zB eine wichtige Architektur Ausnahmen auf?
– Ciro Santilli OurBigBook.com
26. Mai 2015 um 10:11 Uhr
@CiroSantilli六四事件法轮功 Viele undefinierte Verhaltensweisen sind eher auf Mängel des C-Standardkomitees zurückzuführen als auf eine vernünftige Begründung für Hardwarebeschränkungen. Aber in diesem Fall sehe ich nicht wirklich viel Raum für Verbesserungen: Wenn der Standard eine Heraufstufung des richtigen Operanden auf einen vorzeichenlosen Typ erzwingen würde, würden Sie immer noch so etwas wie erhalten a << (unsigned int)-5 was bedeuten würde a << 0xFFFFFFFBwas nach dem oben zitierten Text auch UB ist.
– Ludin
26. Mai 2015 um 13:12 Uhr
Anand
Wie bereits von anderen Mitgliedern beantwortet, erzeugt es undefiniertes Verhalten. Was ich hier erwähnen möchte, ist, dass Sie aus dem Buch (“Auf einer Maschine”) teilweise zu zitieren scheinen. Es verallgemeinert das Verhalten nicht. Das Buch könnte auch erklärt haben, dass das Verhalten gemäß dem Standard nicht definiert ist. Übrigens, ich habe gerade “The New C Standard – An Economic and Cultural Commentary” durchgesehen und diese Aussage gefunden:
Der Intel Pentium SAL-Befehl (der sowohl von gcc als auch von Microsoft C++ generiert wird, um Linksverschiebungen auszuwerten) verwendet nur die unteren fünf Bits des Verschiebungsbetrags
Dies erklärt sehr gut, warum eine Linksverschiebung von -5 zu einer Linksverschiebung von 27 führen könnte (für die Zweierkomplementdarstellung negativer Zahlen).
Ich bin mir sicher, dass der Satz “Auf einer Maschine” im Buch des OP nur als Beispiel dient, gleich nachdem ich festgestellt habe, dass dies nicht definiert ist. Es ist tatsächlich eines der schönen Beispiele dafür, dass “undefiniert” wirklich alles bedeutet und nicht nur “saubere” abrupte Beendigung des ausgeführten Programms. Bei dieser Verwendung würde es keinen Sinn machen, den Eindruck zu erwecken, dass die Linksverschiebung um 27 etwas ist, was Sie zu Recht erwarten.
– Pascal Cuoq
9. Februar 2011 um 17:05 Uhr
+1 für die Beantwortung des Teils der Frage “Was genau passiert [on the quoted “one machine”] beim Schalten mit negativer Schaltzahl”. Sicher, UB ist UB, und daher sollten wir nichts davon annehmen, aber diese Erklärung ist äußerst anschaulich für die Art von Gefahren, zu denen sie geführt haben machen es UB. (mein Gehirn will immer sagen ‘aber warum kann es nicht für wörtliche ganze Zahlen definiert werden’, aber dann denke ich mehr nach und merke, dass das absurd ist 😉
– Unterstrich_d
30. Mai 2016 um 19:51 Uhr
Das Verhalten ist undefiniert.
In der 5-Bit-Binärarithmetik hat das Zweierkomplement -5 die gleiche binäre Darstellung wie unsigned +27, was wahrscheinlich diese spezielle Plattform erklärt.
Ist 5-Bit-Binärarithmetik eine echte Sache? Wie würde char definiert werden?
– CIsForCookies
18. Juli 2017 um 5:56 Uhr
@ClsForCookies – auf elektrischer Ebene ist es eine echte Sache. 8 ist nichts Besonderes.
– Oliver Charlesworth
18. Juli 2017 um 6:10 Uhr
8 ist etwas Besonderes, weil es eine Potenz von 2 ist.
– Benutzer202729
26. März 2018 um 6:16 Uhr
Wenn der Wert, den Sie verschieben, eine 32-Bit-Variable ist, geht das Verschieben von -5 in eine “Schleife” und verschiebt 27 vorwärts. Die Verschiebung kann nur “vorzeichenlos” erfolgen.
int main()
{
unsigned int a = 1;
printf("%u\n",a<<(-1));
return 0;
}
Die Ausgabe ist 2147483648.
Hier ist meine Annahme und Bestätigung: (nur Annahme!)
1.Der rechte Operand „<<“ muss vom Typ unsigned int sein,
also wird zuerst das (int) „-1“ in (unsigned int) „-1“ umgewandelt. Da der int-Typ eine Zweierkomplementdarstellung ist, ist das Ergebnis 2^32-1 (unsigned int)
2. Da die Zahl 2^32-1 größer ist als die maximale Verschiebungsziffer, ist 2^32 – 1 mod 32, was 27 entspricht
ich auch probiert Einige andere negative rechte Operandennummern, und die manuellen Berechnungsergebnisse mit angenommenen Regeln werden mit dem Produkt meiner IDE identisch sein.
Ich versuche, einige unterstützende offizielle Dokumente zu finden, die überprüfen könnten, ob meine Annahme richtig ist oder nicht. Vielleicht kannst du es mir sagen.
Undefiniertes Verhalten ist undefiniert
– Antti Haapala – Слава Україні
18. März 2021 um 9:16 Uhr
Undefiniertes Verhalten ist undefiniert
– Antti Haapala – Слава Україні
18. März 2021 um 9:16 Uhr
14170300cookie-checkLinksverschiebung mit negativer Verschiebungszahlyes
Beachten Sie, dass das Verhalten tatsächlich undefiniertes Verhalten ist, Sie können sich nicht darauf verlassen, dass es Modulo 32 funktioniert. Zum Beispiel.
– Benutzer202729
26. März 2018 um 6:14 Uhr