2017-05-05 2 views
0

Je suis étudiant en génie électrique. Lors de notre cours de programmation, on nous a donné beaucoup d'exercices pour le langage C et on nous a demandé d'expliquer ce qui se passe et comment votre IDE effectue des opérations sur les bits. Ainsi, par exemple, si l'on me donne unsigned short x = 0x000C et que l'on exécute ~x, la sortie est 65523. Comment votre IDE effectue-t-il cette opération?Comment calculer des expressions comme ~ 0x000C à la main?

+3

IDE n'effectue pas ces opérations. De toute façon, avez-vous entendu parler de la représentation binaire des nombres? –

+0

Je comprends comment les nombres sont représentés en notation binaire. – Pero

+2

Vous devez en savoir plus sur les représentations hexadécimales, binaires et décimales des nombres et sur la façon de les convertir. –

Répondre

6

Pour fournir un contexte, d'une manière générale, nous utilisons les préfixes suivants pour désigner différentes représentations de base des nombres:

  • Aucun préfixe signifie base 10, alias décimal (ce que nous utilisons dans la vie quotidienne)
  • 0x signifie base-16, alias hexadécimal (compte de 0-9A-F, donc un seul chiffre peut représenter n'importe quelle valeur entre 0 et 15 ... cela nécessite quatre bits car le nombre 15 a une représentation décimale de 0b1111)
  • 0b signifie base-2, alias binaire (compte de 0-1 ... requi res 1 bit par chiffre)
  • 0 signifie base 8, alias octal (compter 0-7 ... nécessite 3 bits par chiffre)

Ainsi, étant donné que, que vous probablement saviez déjà, mais une autre l'utilisateur ne peut pas, c'est ce qui se passe dans les coulisses d'une manière très haut niveau. En supposant un unsigned short est de 16 bits de large dans votre environnement, et donné ...

unsigned short x = 0x000C = 0b0000 0000 0000 1100

... un ~ est un opérateur de négation logique, ce qui signifie que vous retournez simplement tous les bits. Ainsi, par exemple:

~0b0000 0000 0000 1100 = 0b1111 1111 1111 0011 = 0xFFF3 = 65523

Comme une note, des choses comme ça se complique quand vous commencez à essayer de les faire dans les langues (comme Python et VBScript) que les types natifs abstraits comme des entiers en « nombre infiniment grand » . Renverser les bits d'un short non signé de 16 bits est très différent, et plus possible, que de retourner les bits d'un "nombre infiniment grand".

+0

Merci beaucoup! Makes est tellement plus clair maintenant! – Pero

+0

@ PeroWhatshisnamović absolument! Content que ça aide. Rappelez-vous simplement que l'ALU traite de la représentation binaire des nombres. Toutes les autres représentations sont des abstractions par nos langages de programmation pour faciliter nos vies ...Une fois compilé et assemblé en code machine, tout est binaire. Ainsi, il est utile de penser à toutes ces opérations binaires et à leurs opérandes en termes binaires. – Treebasher

+0

@Treebasher - sauf pour les machines qui utilisent des représentations BCD :-) – pm100