web-dev-qa-db-fra.com

Pourquoi les nombres hexadécimaux préfixés par 0x?

Pourquoi les nombres hexadécimaux portent-ils le préfixe 0x? Je comprends l'utilisation du préfixe mais je ne comprends pas la signification de la raison pour laquelle 0x a été choisi.

376
unj2

Short story: Le 0 indique à l'analyseur qu'il a affaire à une constante (et non à un identifiant/mot réservé). Quelque chose reste nécessaire pour spécifier la base numérique: la x est un choix arbitraire.

Long récit: Dans les années 60, les systèmes de numération de programmation les plus répandus étaient décimaux et octaux - les unités centrales avaient 12, 24 ou 36 bits. par octet, ce qui est divisible par 3 = log2 (8).

Le langage BCPL utilisait la syntaxe 8 1234 pour les nombres octaux. Lorsque Ken Thompson a créé B à partir de BCPL, il a plutôt utilisé le préfixe 0. C'est bien parce que

  1. une constante entière se compose désormais toujours d'un seul jeton,
  2. l'analyseur peut toujours dire tout de suite qu'il a une constante,
  3. l'analyseur peut immédiatement dire à la base (0 est identique dans les deux bases),
  4. c'est mathématiquement sain (00005 == 05), et
  5. aucun caractère spécial précieux n'est nécessaire (comme dans #123).

Lorsque C a été créé à partir de B, le besoin de nombres hexadécimaux est apparu (le PDP-11 avait des mots de 16 bits) et tous les points ci-dessus étaient toujours valables. Comme les octals étaient toujours nécessaires pour les autres machines, 0x a été choisi de manière arbitraire (00 a probablement été exclu, car il est gênant).

C # est un descendant de C, il hérite donc de la syntaxe.

400
Řrřola

Remarque: je ne connais pas la bonne réponse, mais la liste ci-dessous n’est que ma spéculation personnelle!

Comme il a été mentionné, un 0 avant qu'un nombre signifie qu'il est octal:

04524 // octal, leading 0

Imaginez avoir besoin de créer un système pour désigner les nombres hexadécimaux et noter que nous travaillons dans un environnement de style C. Que diriez-vous de terminer avec h comme assemblage? Malheureusement, vous ne pouvez pas - cela vous permettrait de créer des jetons qui sont des identifiants valides (par exemple, vous pourriez nommer une variable de la même manière), ce qui créerait certaines ambiguïtés désagréables.

8000h // hex
FF00h // oops - valid identifier!  Hex or a variable or type named FF00h?

Vous ne pouvez pas mener avec un personnage pour la même raison:

xFF00 // also valid identifier

L'utilisation d'un hachage a probablement été supprimée car elle est en conflit avec le préprocesseur:

#define ...
#FF00 // invalid preprocessor token?

En fin de compte, pour une raison quelconque, ils ont décidé de mettre un x après un 0 pour indiquer hexadécimal. Il est sans ambiguïté puisqu'il commence toujours par un caractère numérique et ne peut donc pas être un identificateur valide. Il est probablement basé sur la convention octale d'un 0 non significatif.

0xFF00 // definitely not an identifier!
92
AshleysBrain

C'est un préfixe pour indiquer que le nombre est en hexadécimal plutôt que dans une autre base. Le langage de programmation C l'utilise pour informer le compilateur.

Exemple:

0x6400 se traduit par 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600. Lorsque le compilateur lit 0x6400, il comprend que le nombre est hexadécimal à l'aide du terme x. Habituellement, nous pouvons comprendre par (6400)16 ou (6400)8 ou peu importe ..

Pour binaire ce serait:

0b00000001

J'espère que j'ai aidé d'une certaine manière.

Bonne journée!

23
loyola

Le 0 précédent est utilisé pour indiquer un nombre en base 2, 8 ou 16.

À mon avis, 0x a été choisi pour indiquer hex car "x" ressemble à hex.

Juste mon avis, mais je pense que cela a du sens.

Bonne journée!

8
Johnny Low