[JAVA] La fin de la programmation catastrophique # 01 "Faites-le avec la valeur absolue d'un entier"

Un programmeur ordinaire le comprend intuitivement et par réflexe, Je voudrais écrire un article sur une histoire rudimentaire et simple. En raison de sa nature rudimentaire, les programmeurs lourds comme moi le font souvent.

S'il y a des erreurs ou du contenu inapproprié, veuillez commenter Nous examinerons les corrections et ajustements du contenu.

1. Valeur absolue d'un entier

Dans de nombreux langages de programmation, il renvoie la valeur absolue d'un entier. Les fonctions et méthodes sont disponibles.

Par exemple Quand j'exécute ʻint result = Math.abs (-15); `, l'argument spécifie un entier négatif, mais Le «15» signé est attribué au «résultat». Ce ne serait pas le cas pour de nombreux programmeurs.

2. Type entier

De nombreux langages de programmation tels que C, Java et C # ont des types entiers. C'est un type pour traiter les nombres entiers, mais cette fois ce n'est pas le sujet principal en soi. Considérez le type int, qui est facile à imaginer pour les personnes expérimentées en C, Java et C #.

Je pense que la taille du type int dépend de la langue et de l'environnement, Pour l'instant, considérez un type entier signé 32 bits.

La plage qu'un type entier signé 32 bits peut représenter est, pour de nombreux langages de programmation, «De -2 147 483 648 à 2 147 483 647» Ça devrait être.

Le simple fait de regarder cela a déjà une atmosphère suspecte.

3. Considérez la valeur absolue du plus petit entier du type entier signé 32 bits.

ʻInt result = Math.abs (-2147483648); Que devient result`? Le nombre d'entiers positifs est jusqu'à ** 2147483647 **, il est donc probable qu'il soit faux.

À propos, dans C # System.Math, OverflowException est levé.

try
{
    int result = System.Math.Abs(Int32.MinValue);
}
catch(OverflowException)
{
    Console.WriteLine("OverflowException se produit");
}

Dans java.lang.Math de Java, même s'il s'agit d'une valeur absolue, il est identique à l'entier négatif -2147483648. (Cela fonctionne comme spécifié.)

int result = Math.abs(Integer.MIN_VALUE);

//C'est une valeur absolue,-Manma de 2147483648.
System.out.printf("result = %d%n", result);

Pour C / C ++ cmath, dans mon environnement, c'était un entier négatif -2147483648. Ce qui se passe ici n'est pas défini, il peut donc avoir des résultats différents selon l'environnement.

#include <cmath>

int main()
{
  int result = abs(INT_MIN);

  return 0;
}

4. La fin

Si vous écrivez du code qui peut transmettre une valeur minimale signée à une fonction ou une méthode qui renvoie une valeur absolue, "** Finalement **" Il est possible que quelque chose de mal se produise.

Le point est "un jour", et dans cet exemple, le problème est Sur les 4 294 967 296 valeurs entières de «-2 147 483 648 à 2 147 483 647» Il n'y en aura qu'un ("-2 147 483 648" uniquement). Le problème n'est peut-être pas évident. Des types d'entiers plus petits devraient être plus problématiques.

5. Contre-mesures

Si de par sa conception, il n'est pas possible de passer une valeur minimale signée, c'est très bien. Sinon, vous devez agir.

Fondamentalement, un traitement spécial est effectué pour la valeur minimale du type entier signé. Par exemple, implémentez de sorte que la valeur minimale soit exclue, Si vous avez également besoin de la valeur absolue de la valeur minimale, je pense que vous utiliserez un type entier qui peut gérer des tailles plus grandes. (Même les types d'entiers de plus grande taille ont des problèmes avec les valeurs minimales.)

Selon les besoins, il est possible d'utiliser un type entier de précision arbitraire tel que BigInteger. Par exemple, dans le cas de Java et C #, il existe des classes et des structures BigInteger, Il existe également une méthode abs () (méthode statique en C #). Avec BigInteger, vous n'avez pas à vous soucier du débordement. (Vous pouvez manquer de mémoire, mais Je voudrais rendre hommage à tous ceux qui manipulent des chiffres tellement énormes qu’ils n’ont plus de mémoire. )

De plus, si possible, créez un test unitaire qui peut évaluer la valeur minimale du type entier signé.

6. Merci

Merci à tous ceux qui ont commenté.

Le contenu lié au commentaire de @ saka1029 sera un article indépendant dans le futur. Le commentaire de @tsuyoshi_cho a été reflété dans cet article.

Recommended Posts

La fin de la programmation catastrophique # 01 "Faites-le avec la valeur absolue d'un entier"
La fin de la programmation catastrophique # 03 "Comparaison d'entiers, si" a> b ", supposons que c'est" a --b> 0 ""
Spécifiez la valeur par défaut avec @Builder of Lombok
Tester le contenu d'un fichier Excel avec JUnit
Vous pouvez le faire avec une copie! Programmation orientée aspect (Android)
La différence entre la programmation qui utilise des classes Ruby et la programmation qui n'utilise pas
Un exemple d'astuce lorsque vous souhaitez diviser la valeur de la définition en fonction de l'environnement mais ne voulez pas en être conscient
L'histoire de toString () commençant par le passage d'un tableau à System.out.println
[Java] Affiche le résultat de ffprobe -show_streams dans JSON et mappe-le à un objet dans Jackson
Une erreur s'est produite dans le cours gratuit de RubyOnRails Udemy, l'a résolue et est allée jusqu'au bout