Negative Werte zu vorzeichenlosen Variablen zuweisen: Das Geheimnis aufdecken
Fasziniert von dem möglichen Ergebnis der Zuweisung negativer Werte zu vorzeichenlosen Variablen machte sich ein Programmierer daran auf einem Experiment. Als sie einer vorzeichenlosen Ganzzahlvariablen namens nVal einen negativen Wert von -5 zuwiesen, waren sie überrascht, dass der Compiler keine Fehler aufwies. Die Ausführung des Programms ergab jedoch ein unerwartetes Ergebnis – nVal hatte einen besonderen Wert.
Auf der Suche nach einer Erklärung vertiefte sich der Programmierer in den C-Standard. Abschnitt 4.7 conv.integral zur Konvertierung von vorzeichenbehafteten Ganzzahltypen lieferte Einblicke. Gemäß dem Standard gilt: Wenn der Zieltyp vorzeichenlos ist, „ist der resultierende Wert die am wenigsten vorzeichenlose ganze Zahl, die mit der Quell-Ganzzahl übereinstimmt (Modulo 2n, wobei n die Anzahl der Bits ist, die zur Darstellung des vorzeichenlosen Typs verwendet werden). .“
Im Wesentlichen bedeutet dies, dass für Nicht-Zweierkomplement-Architekturen (z. B. Signed Magnitude, One's Complement) die Die Konvertierung in vorzeichenlos verhält sich so, als ob das Zweierkomplement verwendet würde. Darüber hinaus ist das wiederholte Addieren oder Subtrahieren von 2n, bis der Wert in den Bereich des vorzeichenlosen Typs fällt, mathematisch äquivalent zur Vorzeichenerweiterung oder Kürzung des Zweierkomplements.
Speziell für das Zweierkomplement das Bitmuster bleibt unverändert, da das Hinzufügen von 2n alle Änderungen aufhebt: die niedrigen n Bits von 2n sind alle Nullen. Diese Eigenschaft macht die Zweierkomplementaddition/-subtraktion bitweise gleichbedeutend mit vorzeichenlosen Operationen, daher ihr besonderer Status.
Es ist bemerkenswert, dass die Konvertierung von Gleitkommazahlen in vorzeichenlose Ganzzahlen unterschiedlich ist. In solchen Fällen führen negative Werte oder solche, die den Bereich des vorzeichenlosen Typs überschreiten, zu undefiniertem Verhalten. Nur Ganzzahlkonvertierungen mit Vorzeichen in Ganzzahlen ohne Vorzeichen verwenden die Modulo-Reduktion.
Das obige ist der detaillierte Inhalt vonWas passiert, wenn Sie einer vorzeichenlosen Ganzzahlvariablen in C einen negativen Wert zuweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!