Pourquoi la valeur minimale des ints, doubles, etc 1 est-elle plus éloignée de zéro que la valeur positive?

10

Je sais que cela a quelque chose à voir avec le complément de 2 et l'ajout de 1, mais je ne comprends pas vraiment comment vous pouvez coder un nombre de plus avec la même quantité de bits lorsqu'il s'agit de nombres négatifs.

papercuts
la source
3
La partie vraiment désagréable de cela est que Abs (MinValue) est négatif.
OldFart
1
en java Double.MIN_VALUE est la plus petite valeur positive , et les (réels) nombres les plus éloignés de zéro ont une magnitude égale (car il a un bit de signe approprié)
ratchet freak

Réponses:

16

Pensez-y en ces termes. Prenez un nombre de 2 bits avec un signe précédent:

000 = 0
001 = 1
010 = 2
011 = 3

Ayons maintenant quelques points négatifs:

111 = -1
110 = -2
101 = -3

Attendez, nous avons aussi

100 ... 

Il doit être négatif, car le bit de signe est 1. Donc, logiquement, il doit être -4.

(Edit: Comme WorldEngineer le fait remarquer à juste titre , tous les systèmes de numérotation ne fonctionnent pas de cette façon - mais ceux que vous demandez fonctionnent.)

pdr
la source
11

Parce qu'il n'y a pas deux classes de nombres dans la plage entière, mais trois: les nombres négatifs, zéro et les nombres positifs. Zéro doit occuper un slot (il serait plutôt peu pratique de ne pas pouvoir représenter zéro ...), donc la classe positive ou négative doit abandonner un slot. Le fait que c'est généralement la plage positive qui doit faire ce sacrifice est dans une certaine mesure arbitraire, mais au niveau des manipulations de bits, il y a certaines choses que cette décision rend plus commode.

Kilian Foth
la source
Ce ne sont pas seulement de petites manipulations. L'ensemble des nombres signés sur 32 bits est l'ensemble des nombres dont la représentation binaire a la même valeur dans tous les bits après le 31, et un de ces nombres a un ensemble infini de uns suivi de 31 zéros. L'inverse additif de ce nombre, une chaîne infinie de zéros suivie d'un seul 1 et 31 zéros, ne correspond pas au modèle requis des valeurs signées.
supercat
4

Il existe essentiellement trois façons de représenter des entiers signés en binaire: complément à 2, complément à 1 et amplitude du signe. (Biquinary a suivi le chemin du Dodo Bird il y a longtemps.)

Le complément et l'amplitude du signe de 1 ont deux valeurs nulles, +0 et -0, chacune avec une représentation unique. Le complément de 2 n'a qu'une seule valeur zéro et une seule représentation.

Maintenant, un champ de N bits peut coder 2 ^ N valeurs. Soustrayez un complément à 2, et vous avez 2 ^ N-1 = 2 ^ (N-1) + 2 ^ (N-1) + 1. Puisque la représentation pour zéro est tous les bits zéro, et un signe + est zéro, il y aura une autre représentation non nulle possible avec le bit de signe mis à 1.

C'est une façon très longue de dire que le complément à 2 représente des valeurs dans la plage - (2 ^ (N-1)) .. + (2 ^ (N-1) - 1).

Le complément 1 a en fait un avantage sur le complément 2 si vous effectuez des calculs de traitement de signaux numériques entiers. Les opérations complémentaires de 1 sont intrinsèquement tronquées vers zéro. Le complément de 2 tronque vers l'infini. J'ai appris celui-ci à la dure ...

John R. Strohm
la source