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.
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.
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.
ʻ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;
}
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.
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é.
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