[JAVA] Das Ende der katastrophalen Programmierung # 01 "Mach es mit dem absoluten Wert einer ganzen Zahl"

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.

1. Absolutwert der ganzen Zahl

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.

2. Integer-Typ

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.

3. Betrachten Sie den absoluten Wert der kleinsten Ganzzahl des 32-Bit-Ganzzahltyps mit Vorzeichen

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

4. Das Ende

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.

5. Gegenmaßnahmen

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.

6. Danke

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

Das Ende der katastrophalen Programmierung # 01 "Mach es mit dem absoluten Wert einer ganzen Zahl"
Das Ende der katastrophalen Programmierung # 03 "Der Vergleich von ganzen Zahlen, wenn" a> b ", nimmt an, dass es" a - b> 0 "ist."
Geben Sie den Standardwert mit @Builder of Lombok an
Testen Sie den Inhalt einer Excel-Datei mit JUnit
Sie können es mit Kopie tun! Aspektorientierte Programmierung (Android)
Der Unterschied zwischen der Programmierung mit Ruby-Klassen und der Programmierung ohne Ruby-Klassen
Ein Beispiel für kleine Arbeiten, bei denen Sie den Definitionswert nach der Umgebung aufteilen möchten, sich dessen jedoch nicht bewusst sein möchten
Die Geschichte von toString () beginnt mit der Übergabe eines Arrays an System.out.println
[Java] Geben Sie das Ergebnis von ffprobe -show_streams in JSON aus und ordnen Sie es einem Objekt in Jackson zu
Im kostenlosen Kurs von RubyOnRails Udemy ist ein Fehler aufgetreten, der behoben und bis zum Ende durchgearbeitet wurde