Absoluter Wert von INT_MIN [doppelt]

8

Wie kann ich den absoluten Wert von INT_MIN ohne Überlauf extrahieren? Siehe diesen Code für das Problem:

%Vor%

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.

    
Morgan Wilde 08.03.2014, 11:38
quelle

6 Antworten

2

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.

%Vor%

Dies gibt die Ausgabe auf meinem 32-Bit-Rechner:

%Vor%     
ajay 08.03.2014, 11:52
quelle
2

Wie wäre es mit

? %Vor%

Oder wenn Ihr long nicht länger ist als ein int :

%Vor%

Oder wenn Sie bereit sind zu akzeptieren, dass abs(INT_MIN) immer INT_MAX + 1 :

ist %Vor%     
abligh 08.03.2014 11:46
quelle
2

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;.

verwendet

Da 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 .

    
ninjalj 08.03.2014 12:56
quelle
0

In C existiert nur die int-Version für die Funktion int abs(int j) . Sie können eine andere Funktion labs unter der Überschrift stdlib.h verwenden. Sein Prototyp: long int labs(long int j);

%Vor%     
xuefu 08.03.2014 12:00
quelle
0

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(...) )

%Vor%

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.

%Vor%

Beachten Sie, dass die expliziten Umwandlungen tatsächlich unnötig sind, da die Funktion selbst das Argument implizit ausgibt

    
xmoex 08.03.2014 12:04
quelle
-1

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:

%Vor%

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:

%Vor%

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.

    
ThoAppelsin 08.03.2014 11:49
quelle

Tags und Links