web-dev-qa-db-fra.com

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

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

Un développeur m'a demandé aujourd'hui ce que sont les bits 65535 et 32, c'est-à-dire 2¹⁶-1 et 2⁵ =? J'ai d'abord pensé spontanément au 32, mais cela m'a semblé facile après quoi j'ai réfléchi pendant plusieurs minutes, puis j'ai répondu au 32. Le 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?

10
Niklas

Le nombre est traité comme un non signé entier 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 ).

22
epistemex

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

18
ggambett

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

10
Chris Kent