Wie kann ich den absoluten Wert von INT_MIN
ohne Überlauf extrahieren? Siehe diesen Code für das Problem:
Spuckt das folgende aus
%Vor% Ich brauche das für eine Überprüfung, ob ein int
-Wert größer als Null ist.
Da es sich bei dieser Frage um ein Duplikat von Warum ist der absolute Wert der maximalen negativen Ganzzahl -2147483648 immernoch -2147483648? , ich muss widersprechen, da dies eine WIE ist, keine WHY Frage.
Der %d
-Konvertierungsspezifizierer in der Formatzeichenfolge printf
konvertiert das entsprechende Argument in eine vorzeichenbehaftete Dezimalzahl, die in diesem Fall für den int
-Typ überläuft. Der C-Standard erwähnt ausdrücklich, dass vorzeichenbehafteter Integer-Überlauf ein nicht definiertes Verhalten ist. Was Sie tun sollten, ist %u
in der Formatzeichenfolge zu verwenden. Außerdem müssen Sie die Header stdio.h
und stdlib.h
für den Prototyp der Funktionen printf
bzw. abs
einfügen.
Dies gibt die Ausgabe auf meinem 32-Bit-Rechner:
%Vor%Es gibt keine Möglichkeit, den absoluten Wert der negativsten Zahl als Ganzzahl zu extrahieren. Der ISO C Standard sagt (§6.2.6.2¶2):
Jedes Bit, das ein Wertbit ist, muss denselben Wert wie das gleiche Bit im Objekt haben Darstellung des entsprechenden vorzeichenlosen Typs (wenn im signed M-Wert-Bits vorhanden sind Typ und N im unsigned Typ, dann M ≤ N).
Beachten Sie, dass es ≤, nicht & lt;.
verwendetDa das Vorzeichenbit im Zweierkomplement den Wert - (2 M ) hat und jedes Wertbit einen Wert hat, der zwischen eine Zweierpotenz ist 1 und 2 M-1 gibt es bei Implementierungen, bei denen M = N für steht, keine vorzeichenlose Ganzzahl 2 N kann es nur bis zu 2 N -1 = 1 + 2 + ... + darstellen 2 N-1 .
Das Einstufen in den nächsten verfügbaren größeren Integer-Typ sollte es tun. aber Sie müssen die entsprechende abs-Variante verwenden (in diesem Fall llabs(...)
)
bearbeiten:
Sie können überprüfen, was der nächstgrößere Typ ist, indem Sie INT_MIN
mit LONG_MIN
und LLONG_MIN
vergleichen. Vielleicht wird in deinem Fall eine Umwandlung in long
dies bereits tun.
Beachten Sie, dass die expliziten Umwandlungen tatsächlich unnötig sind, da die Funktion selbst das Argument implizit ausgibt
Als Erstes müssen Sie #include <math.h>
verwenden, um die Funktion abs
korrekt zu verwenden.
Zweitens, wenn Sie nur den Absolutwert des in INT_MIN
definierten limits.h
drucken möchten, können Sie ihn einfach als unsigned integer
oder als long long integer
ausgeben. so:
Da Sie den absoluten Wert haben möchten, der definitiv nicht signiert ist, sollte dies in Ordnung sein.
Wenn du math.h
nicht einfügen willst, kannst du es selbst so machen:
Wenn Sie es für andere Zwecke verwenden möchten, können Sie den abs( INT_MIN )
Wert in unsigned int
oder long long int
Variablen speichern.
Tags und Links c int integer-overflow