EDU>> intmin ans = -2147483648 EDU>> abs(intmin) ans = 2147483647 How is this possible? There must be some sort of overflow or the definitions of these functions are mingling in strange ways.
3 Réponses :
Pour encoder zéro, il doit y avoir une asymétrie parmi les entiers de complément positif / négatif. p>
En effet, vous voyez un débordement entier (saturation). P>
pour le complément de 2 a signé des entiers de 32 bits, Matlab fait effectivement quelque chose d'impair. Sous les règles normales du complément de 2, Cette bizarrerie a un effet secondaire intéressant, cependant: vous pouvez supposer que INTMIN code> est
0x80000000 code> ou même
-2147483648 code>. Cependant,
intmax code> est
0x7fffffff code>, qui n'est que
2147483647 code>. Cela signifie que la négation de
INTMIN code> serait
2147483648 code>, qui ne peut pas être représenté dans des entiers signés à 32 bits. P>
0 - 0x80000000 code> doit donner
0x80000000 code> à nouveau. Cependant, selon MATLAB,
0 - 0x80000000 = 0x7FFFFFF code>. Cela devrait expliquer pourquoi
ABS (INTMIN) = INTMAX code> est contenant pour MATLAB (mais pas nécessairement dans d'autres langues). P>
ABS code> ne renvoie jamais un numéro négatif. P>
MATLAB utilise la saturation plutôt que le comportement "enveloppant" que vous voyez dans des langues telles que C. En outre, je pense que le débordement des entiers signés en C est comportement indéfini i>
pour chaque Type de données entier est un plus grand nombre et plus petit que vous pouvez représenter avec ce type:
P>
Lorsque le résultat d'une expression impliquant des entiers dépasse la valeur maximale (ou minimale) du type de données, MATLAB mappe les valeurs situées en dehors de la limite au point final le plus proche. Ce Saturation Comportement explique ce que vous voyez plutôt qu'un cas étrange de Exemple: p>
Vérifiez Two's Complément et gammes pour des nombres 32 bits.