Linksverschiebung mit negativer Verschiebungszahl

Lesezeit: 4 Minuten

Was genau passiert hier?

a << -5

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

Benutzeravatar von Lundin
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

Benutzeravatar von Anand
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

1417030cookie-checkLinksverschiebung mit negativer Verschiebungszahl

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy