Le numéro 65535 a-t-il quelque chose de spécial?

11

2¹⁶-1 & 2⁵ = 2⁵ (ou? Évidemment?)

Un développeur m'a demandé aujourd'hui ce qu'est 65535 & 32 au niveau du bit, c'est-à-dire 2¹⁶-1 & 2⁵ =? J'ai pensé au début spontanément 32 mais cela m'a semblé facile après quoi j'ai réfléchi pendant plusieurs minutes puis j'ai répondu 32. 32 semble avoir été la bonne réponse mais comment? 65535 = 2¹⁶-1 = 1111111111111111 (mais cela ne semble pas correct puisque ce nombre binaire tout doit être -1 (?)), 32 = 100000 mais je n'ai pas pu le convertir dans ma tête, après quoi j'ai de toute façon répondu 32 depuis que j'avais pour répondre à quelque chose. La réponse 32 est-elle en fait triviale? Est-ce de la même manière 2¹⁶-1 & 2⁵-1 = 31? Pourquoi le développeur m'a-t-il demandé exactement 65535?

Binaire, ce qu'on m'a demandé d'évaluer était 1111111111111111 et 100000, mais je ne comprends pas pourquoi 1111111111111111 n'est pas -1. Cela ne devrait-il pas être -1? 65535 est-il un nombre qui donne un débordement et comment le savoir?

Niklas
la source
3
Il doit y avoir quelque chose de spécial. Cela me rappelle 56 6635, la norme nationale tchèque pour la bière. Hmmmm ... le temps d'une bière.
joshp
5
Vous faites trop d'hypothèses: 65535 donne -1 uniquement dans l'arithmétique du complément à deux de 16 bits. Il donne -0 en arithmétique du complément à 16 bits et 65535 en complément des deux à 32 bits et l'arithmétique du complément.
mouviciel
3
Il s'agit de la limite supérieure des ports TCP.
Renae Lider

Réponses:

23

Le nombre est traité comme un entier non signé dans ce cas, ce qui signifie que tous les bits définis ne produiront pas -1 (s'il était signé, alors oui, vous auriez raison). Ainsi, l'ensemble des 16 bits vous donnera 65535.

Curieusement, l'état signé n'est pas un facteur lors des opérations de bits logiques. Les bits ne sont pas eux-mêmes signés car ils sont le composant le plus bas d'un ordinateur. Il est spécifié par l'opération cpu si les bits de ex. un registre sera traité signé ou non signé.

Les nombres négatifs sont produits en définissant le bit le plus significatif (MSB) sur true SI le nombre est traité comme signé (quel "côté", ou quel bit externe sera défini varie en fonction de l'architecture du processeur, c'est-à-dire big-endian / little-endian ).

épistémex
la source
9
La plupart des machines modernes se convertissent en négatif en retournant les bits et en ajoutant un complément d'un: 2. Le simple fait de régler un bit vous pose le problème d'avoir +0 et -0.
James
1
Ce n'est pas forcément un problème. Le complément de 1 tronque vers zéro, quel que soit le signe du résultat. Le complément de 2 tronque vers l'infini. Dans certaines applications, cela peut vous causer des ennuis.
John R. Strohm
18

Il est trivial. 65535 en binaire est tout un, donc ET le faire avec un X inférieur à 65535 vous donnera X.

ggambett
la source
10

Répondre à la deuxième partie de votre question. Vous l'avez marqué comme donc 65535 en 32 bits est 00000000000000001111111111111111, signé ou non, ce n'est pas -1.

Chris Kent
la source