[JAVA] Cas souvent oubliés en raison d'un dépassement d'entier

Pour les programmeurs, lors du calcul, concernant le débordement, Je pense que je fais toujours attention Je résumerai brièvement les cas souvent oubliés.

Cet article est un contenu biographique tiré du contenu suivant.

1. Conditions préalables pour garder les choses simples

Pour simplifier les choses, supposons un type entier signé 32 bits. Concernant le contenu de cette heure, s'il s'agit d'un type entier signé avec une précision fixe, D'autres tailles devraient également s'appliquer.

En Java, C #, C / C ++ Pensez à int, Int32, int32, etc. (En C / C ++, on suppose que le type int est un système de traitement 32 bits.)

2. Débordement souvent oublié dans la multiplication

La multiplication de grands nombres est facile à déborder Ce n'est pas le sujet principal car je pense que vous pouvez l'imaginer tout de suite.

Le sujet principal est les cas suivants.

int a = Int32.MinValue;
int b = -1;

int answer = a * b;
int a = Integer.MIN_VALUE;
int b = -1;

int answer = a * b;
int a = INT_MIN;
int b = -1;

int answer = a * b;

«A» contient «-2147483648», La multiplication par "-1" dépasse "2147483647", qui peut être représentée par un entier signé de 32 bits. Dans mon environnement, le résultat de chaque variable «réponse» est «-2147483648». Pour C #, si vous le définissez sur «vérifié», une OverFlowException se produira.

Si la valeur peut être évaluée au moment de la construction ou de la compilation, À ce stade, un débordement peut être détecté.

3. Débordement souvent oublié dans la division (division)

En division entière, si le dépassement ne se produit pas, Dans certains cas, il peut être mal compris, mais il peut déborder correctement (?!).

int a = Int32.MinValue;
int b = -1;

int answer = a / b;
int a = Integer.MIN_VALUE;
int b = -1;

int answer = a / b;
int a = INT_MIN;
int b = -1;

int answer = a / b;

Similaire à la multiplication, mais Diviser par «-1» équivaut à multiplier par «-1», donc Il dépasse «2147483647» qui peut être représenté par un entier signé de 32 bits. Dans mon environnement, en Java, le résultat de la variable ʻanswer est -2147483648. En C ++, une exception de dépassement d'entier s'est produite. ** Pour C #, j'obtiens une OverFlowException indépendamment du fait qu'il soit vérifié` ou non. ** **

3. Résumé

Recommended Posts

Cas souvent oubliés en raison d'un dépassement d'entier
[Mis à jour de temps à autre] Liens endettés
[Java] Le problème selon lequel les images téléchargées ne sont pas mises à jour en raison de l'influence du cache