Ein gewöhnlicher Programmierer versteht es intuitiv und reflexiv. Ich möchte einen Artikel über eine rudimentäre und einfache Geschichte schreiben. Aufgrund seiner rudimentären Natur tun es schwere Programmierer wie ich oft.
Wenn es Fehler oder unangemessene Inhalte gibt, kommentieren Sie bitte Wir werden Korrekturen und Anpassungen des Inhalts berücksichtigen.
In vielen Programmiersprachen wird der absolute Wert einer Ganzzahl zurückgegeben. Funktionen und Methoden stehen zur Verfügung.
Zum Beispiel Wenn ich "int result = Math.abs (-15);" ausführe, gibt das Argument eine negative Ganzzahl an, aber Die signierte "15" wird dem "Ergebnis" zugewiesen. Dies wäre bei vielen Programmierern nicht der Fall.
Viele Programmiersprachen wie C, Java und C # haben ganzzahlige Typen. Es ist ein Typ für den Umgang mit ganzen Zahlen, aber diesmal ist es nicht das Hauptthema an sich. Betrachten Sie den int-Typ, den sich erfahrene Benutzer in C, Java und C # leicht vorstellen können.
Ich denke, die Größe des int-Typs hängt von der Sprache und der Umgebung ab. Betrachten Sie zunächst einen 32-Bit-Integer-Typ mit Vorzeichen.
Der Bereich, den ein 32-Bit-Integer-Typ mit Vorzeichen darstellen kann, ist für viele Programmiersprachen: "-2.147.483.648 bis 2.147.483.647" Es sollte sein.
Schon das Betrachten hat schon eine verdächtige Atmosphäre.
Wenn Sie "int result = Math.abs (-2147483648)" ausführen, was passiert dann mit "result"? Die Anzahl der positiven Ganzzahlen beträgt bis zu ** 2147483647 **, daher ist es wahrscheinlich falsch.
Übrigens wird in C # System.Math
eine OverflowException ausgelöst.
try
{
int result = System.Math.Abs(Int32.MinValue);
}
catch(OverflowException)
{
Console.WriteLine("OverflowException tritt auf");
}
In Javas java.lang.Math
ist es, selbst wenn es ein absoluter Wert ist, dasselbe wie die negative ganze Zahl -2147483648
.
(Dies funktioniert wie angegeben.)
int result = Math.abs(Integer.MIN_VALUE);
//Es ist ein absoluter Wert,-Manma von 2147483648.
System.out.printf("result = %d%n", result);
Für C / C ++ cmath
war es in meiner Umgebung eine negative ganze Zahl -2147483648
.
Was hier passiert, ist undefiniert, daher kann es je nach Umgebung zu unterschiedlichen Ergebnissen kommen.
#include <cmath>
int main()
{
int result = abs(INT_MIN);
return 0;
}
Wenn Sie Code schreiben, der einen vorzeichenbehafteten Mindestwert an eine Funktion oder Methode übergeben kann, die einen absoluten Wert zurückgibt, "** Eventuell **" Es besteht die Möglichkeit, dass etwas nicht stimmt.
Der Punkt ist "eines Tages", und in diesem Beispiel ist das Problem Von den 4.294.967.296 ganzzahligen Werten von "-2.147.483.648 bis 2.147.483.647" Es wird nur eine geben (nur "-2.147.483.648"). Das Problem ist möglicherweise nicht offensichtlich. Kleinere Ganzzahltypen sollten problematischer sein.
Wenn es von Natur aus keine Möglichkeit gibt, einen signierten Mindestwert zu übergeben, ist das in Ordnung. Wenn nicht, müssen Sie Maßnahmen ergreifen.
Grundsätzlich wird eine spezielle Verarbeitung für den Mindestwert des vorzeichenbehafteten Integer-Typs durchgeführt. Implementieren Sie beispielsweise so, dass der Mindestwert ausgeschlossen wird. Wenn Sie auch den absoluten Wert des Mindestwerts benötigen, werden Sie wahrscheinlich einen ganzzahligen Typ verwenden, der größere Größen verarbeiten kann. (Auch größere Integer-Typen haben Probleme mit Mindestwerten.)
Abhängig von den Anforderungen ist es möglich, einen Integer-Typ mit beliebiger Genauigkeit wie "BigInteger" zu verwenden.
Im Fall von Java und C # gibt es beispielsweise BigInteger-Klassen und -Strukturen.
Es gibt auch eine abs () -Methode (statische Methode in C #).
Mit BigInteger
müssen Sie sich keine Sorgen über das Überlaufen machen.
(Möglicherweise geht Ihnen der Speicher aus, aber
Ich möchte jedem meinen Tribut zollen, der mit Zahlen umgeht, die so groß sind, dass ihnen der Speicher ausgeht. )
Erstellen Sie nach Möglichkeit auch einen Komponententest, mit dem der Mindestwert des vorzeichenbehafteten Ganzzahltyps bewertet werden kann.
Vielen Dank an alle, die kommentiert haben.
Der Inhalt des Kommentars von @ saka1029 wird in Zukunft ein unabhängiger Artikel sein. Der Kommentar von @tsuyoshi_cho wurde in diesem Artikel wiedergegeben.
Recommended Posts