J'ai la if
condition suivante .
if (i == -i && i != 0)
Quelle valeur de i
retournera true
pour cette condition en Java?
Je suis incapable de penser à une telle valeur de i
considérer la notation du complément à deux en Java.
J'aimerais aussi avoir une preuve algébrique de la réponse de cette condition (dans le contexte de Java)?
-0.0
c'est aussi== 0
if(i && i == -i)
Réponses:
La seule
int
valeur pour laquelle cela fonctionne estInteger.MIN_VALUE
.C'est parce que les entiers sont annulés en utilisant la méthode du complément à deux .
En utilisant
vous voyez que
Integer.MIN_VALUE
c'estPrendre la valeur négative se fait en échangeant d'abord
0
et1
, ce qui donneet en ajoutant
1
, ce qui donneComme vous pouvez le voir dans le lien que j'ai donné, Wikipédia mentionne le problème avec les nombres les plus négatifs et précise que c'est la seule exception:
Bien sûr, vous avez le même phénomène
Long.Min_Value
si vous le stockez dans unelong
variable.Notez que cela est uniquement dû aux choix qui ont été faits concernant le stockage binaire des ints en Java . Une autre (mauvaise) solution aurait pu par exemple être de nier en changeant simplement le bit le plus significatif et en laissant les autres bits inchangés, cela aurait évité ce problème avec MIN_VALUE mais aurait fait 2
0
valeurs différentes et une arithmétique binaire compliquée (comment auriez-vous incrémenté par exemple?).la source
La valeur que vous recherchez est
Integer.MIN_VALUE
.C'est hors sujet pour Stack Exchange. Mais vous pouvez le faire à partir de la définition des entiers Java ( JLS 4.2 )
et
et la définition de l'opérateur unaire Java '-' ( JLS 15.15.4 ):
la source
i != -i
). Cela laisse deux nombres dans la plage:0
etInteger.MIN_VALUE
. À cause dei != 0
votre si, il neMIN_VALUE
reste que.En plus des réponses données jusqu'à présent ...
Il y a quatre valeurs au total
Les valeurs encapsulées sont déballées et sont donc également vraies pour cette expression.
Remarque: documents Math.abs.
et
Il est surprenant que Math.abs renvoie un nombre négatif. Cela se produit soit parce que a) il n'y a pas de valeurs positives pour -MIN_VALUE dans ces cas b) l'exécution du
-
calcul entraîne un débordement.Ce qui est également intéressant, c'est pourquoi Byte.MIN_VALUE, Short.MIN_VALUE ne le font pas. Ceci est dû au
-
fait que le type changeint
pour ceux-ci et donc aucun débordement.Character.MIN_VALUE n'a pas de problème car il est égal à 0.
Float.MIN_VALUE et Double.MIN_VALUE ont une signification différente. Il s'agit de la plus petite valeur représentable supérieure à zéro. Ainsi, ils ont des valeurs négatives valides qui ne sont pas elles-mêmes.
la source
Comme les autres l'ont mentionné, cela n'est accompli que par
Integer.MIN_VALUE
. Quant à la preuve, permettez-moi d'offrir une explication plus facile à comprendre autrement qu'en binaire (bien qu'elle soit toujours enracinée dans cela).Notez que
Integer.MIN_VALUE
est égal à-2^31
ou-2147483648
etInteger.MAX_VALUE
est égal à2^31-1
ou2147483647
.-Integer.MIN_VALUE
is2^31
, qui est maintenant trop grand pour un entier (puisqu'il est passéMAX_VALUE
) provoquant ainsi un débordement d'entier, le faisant àInteger.MIN_VALUE
nouveau. C'est le seul entier qui fait cela puisqueMIN_VALUE
c'est le seul nombre sans équivalent négatif à part 0.la source
2147483648
peut apparaître dans le code source que dans une circonstance: comme l'opérande de l'opérateur unaire moins (JLS 3.10.1).Preuve algébrique provisoire, utilisant l'
modulo 2^32
arithmétique:i == -i
peut être réécrit comme2 * i == 0
(en ajoutant desi
deux côtés), oui << 1 == 0
.Cette équation a deux solutions de la forme
i == 0 >> 1
, à savoir0b
et10000000000000000000000000000000b
obtenue en se déplaçant vers la gauche0
ou1
vers la gauche.La solution
i == 0
étant exclue, il reste la solutioni == 100000000000000000000000000000000b
.la source
Ce n'est peut-être pas trop instructif, mais au lieu de penser que vous pourriez exécuter ce code:
pour voir qu'il imprime
infiniment :)
la source
<