|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Bonjour!
Je propose une discussion à l'usage des débutants autour de l'écriture binaire. Il n'est pas mauvais, de temps en temps, de revenir aux choses fondamentales dont on n'a pas toujours une connaissance très distincte. Par exemple, je viens d'apprendre ce que veut dire le mot bit. Je ne le savais pas, et peut-être ne suis-je pas le seul dans ce cas. Ça veut dire binary digit, c'est-à-dire un chiffre binaire. Dès lors j'ai pu comprendre (enfin je crois) ce que c'était qu'un octet! J'en étais si content que j'en ai fait un programme. @Paul TOTH J'ai inséré la modification que tu m'avais montrée, mais je ne suis pas venu à bout de la comprendre. C'est pourquoi j'ai conservé les deux versions de la fonction. Code :
__________________
L'Art est long et le Temps est court. |
||
|
|
10
|
|
|
#2 | ||||
|
Expert Confirmé Sénior
![]() ![]() Paul TOTHFreelance Inscription : novembre 2002 Messages : 4 396 ![]() |
Alors on va ajouter une petite info
en primaire on apprend les bases, notion qui semble bien obscure à cet âge là et qu'on oublie ensuite pendant longtemps...puis on fait de l'informatique et on nous parle de binaire, décimal, hexadécimal...ça va en Pascal on échappe à l'octal...et tout cela ce n'est rien d'autre que des bases: binaire = base 2 décimal = base 10 hexadécimal = base 16 octal = base 8On retrouve aussi dans le codage des mails le codage Base64 qui lui est plus explicite, c'est de la base 64. Alors c'est quoi une base ? et bien ce sont les "chiffres" qu'on utilise pour écrire un nombre, en base 10 on a "0123456789", pour le 10ième nombre on utilise 2 chiffres "1" et "0". C'est à dire que le "0" implicite devant "09" passe à "1" et le "9" revient à "0"; c'est comme ça qu'on passe de "9" (ou "09") à "10". Quand on était petit on faisait des paquets de 10 allumettes et des paquets de paquets pour savoir combien on en avait en tout, 1 paquet + 2 allumettes = 12 allumettes Dans les autres bases on utilise d'autres chiffres base 2 = "01" base 10 = "0123456789" base 16 = "0123456789abcdef" base 8 = "01234567" base 64 = "A..Z","a..z","0..9","+/"et le principe est le même, quand on n'a plus assez de chiffre pour compter un nombre on ajoute le "1" devant et on repasse au "0" (en base 64 c'est B et A) du coup on peut faire un traitement de conversion d'un nombre dans un base assez facilement (en dehors de la base 64 qui n'utilise pas les chiffres classiques) Code :
Code :
__________________
Developpez.com: Mes articles, forum FlashPascal Entreprise: Execute SARL Produits : UPnP, RemoteOffice, FlashPascal Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5% |
||||
|
20
|
|
|
#3 |
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Merci pour la leçon et pour l'exercice.
__________________
L'Art est long et le Temps est court. |
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Voici la fonction IntToBase dans sa version Turbo Pascal.
Code :
__________________
L'Art est long et le Temps est court. |
||
|
|
00
|
|
|
#5 | |||||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Citation:
Code :
__________________
L'Art est long et le Temps est court. |
|||||
|
|
10
|
|
|
#6 |
|
Expert Confirmé Sénior
![]() ![]() Paul TOTHFreelance Inscription : novembre 2002 Messages : 4 396 ![]() |
Parfait
__________________
Developpez.com: Mes articles, forum FlashPascal Entreprise: Execute SARL Produits : UPnP, RemoteOffice, FlashPascal Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5% |
|
00
|
|
|
#7 | ||
|
Expert Confirmé
![]() ![]() Inscription : août 2006 Messages : 3 414 ![]() |
Joe,
[QUOTE=Paul TOTH;6721930] Code :
1 - Généralement, pour écrire dans une base autre que 10, on considère que la donnée est un format non signé (donc BYTE, WORD, DWORD... pour Pascal), il faudrait donc un cast si tu gardes l'entête de la fonction. 2 - en base 10, il faudra tenir compte du fait qu'un nombre peut être négatif, et donc ajouter le signe dans la représentation en chaîne. Je réagis, car en l'état, ta fonction est incapable de montrer la représentation de tout entier < 0, d'où problème manifeste, et qu'il faudra aussi tenir compte de la remarque 1 ci-dessus.
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir. |
||
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() ![]() Paul TOTHFreelance Inscription : novembre 2002 Messages : 4 396 ![]() |
Remarque judicieuse
j'ai utilisé Integer comme type générique et non pour autoriser les valeurs négatives sinon base aurait été déclaré TBase = 2..16; sous peine d'avoir des résultats inattendus Ceci dit la notation "-$5" est acceptable, il est donc relativement simple d'introduire le support des négatifs sans passer par la forme $FFFFFFFFFFFFFFFB.
__________________
Developpez.com: Mes articles, forum FlashPascal Entreprise: Execute SARL Produits : UPnP, RemoteOffice, FlashPascal Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5% |
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() ![]() Inscription : août 2006 Messages : 3 414 ![]() |
Hie,
Oui, MAIS : - tu ne tiens pas compte des valeurs négatives pour créer la représentation et tu te prives donc de la moitié des valeurs possibles. - "-$5" ne sert qu'à entrer une valeur exprimée en hexa. Quid des bases 2 et 8 ? Bref, je maintiens ma remarque. Un type générique, ok, mais il faut tenir compte de toutes les possibilités, ce qui n'est pas du tout le cas de ta fonction. Comme apparemment ça sert à notre ami Roland Chastain pour apprendre à gérer les différentes représentations, et que la fonction proposée ne permet pas de représenter les données négatives, qui sont "spéciales" pour les nombres signés, je me demande s'il sait comment ça fonctionne ?
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir. |
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Dans ma carrière de programmeur du dimanche, je n'ai jamais vu une écriture binaire ou hexadécimale utilisée pour noter un nombre négatif. Donc je n'ai pas cru devoir approfondir le sujet. Mais s'il y a des choses à apprendre, je vous écoute.
Autrement, pour l'en-tête qui ne correspond pas exactement à l'usage de la fonction, je rencontre souvent ce problème, mais j'ai fini par me dire qu'on ne pouvait pas le résoudre rigoureusement. Ou alors il faudrait redéfinir tous les types à chaque fois en fonction des besoins ! Par exemple cette fonction qui calcule les puissances de 2: Code :
__________________
L'Art est long et le Temps est court. |
||
|
|
00
|
|
|
#11 | ||||
|
Expert Confirmé Sénior
![]() ![]() Paul TOTHFreelance Inscription : novembre 2002 Messages : 4 396 ![]() |
Ceci dit, LongInt (qui est strictement équivalent à Integer sous Delphi) est un entier signé...ce que ne sera jamais (signé) une puissance de 2
pour ce qui est de la remarque de droggo il faut savoir que pour des entiers sur 32bits: Code :
"-012" est un nombre négatif en base 8, c'est en fait implicitement la différence "0 - 012". Mais si on prend la fonction IntToHex(-1, 8) de Delphi (où 8 est le nombre caractères à retourner et non la base) on obtient FFFFFFFF, soit une représentation hexadécimale "non signée". A mon avis, ce qui joue en faveur de la représentation avec le signe "-" c'est qu'elle est indépendante du nombre de bits. '-$5' reste négatif qu'on le place dans un entier (signé) 16, 32 ou 64 bits, alors que 'FFFFFFFF' sera positif en 64 bits (signés ou pas) et négatif en 32bits signés. On peut aussi considérer que 'FFFFFFFF' représente -1 car la longueur de la chaîne représente 32bits, mais il est tout de même plus sympa d'écrire "-&1" ou "-$1", que leur équivalent non signé sur 32 ou 64 bits Autre solution: Code :
__________________
Developpez.com: Mes articles, forum FlashPascal Entreprise: Execute SARL Produits : UPnP, RemoteOffice, FlashPascal Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5% |
||||
|
20
|
|
|
#12 |
|
Expert Confirmé
![]() ![]() Inscription : août 2006 Messages : 3 414 ![]() |
Joe,
Je veux bien que tu utilises les différentes de cette manière, après tout, c'est ton problème. Mais, quand je regarde mon parcours de programmeur, je n'ai eu besoin de travailler avec des bases autres que 10 que pour 2 cas, toujours parce qu'il est utile de visualiser les bits : - travailler avec un type qui utilise différents champs de bits dans une même variable (à l'époque, je me suis bien amusé avec le type real de TP) - travailler sur une variable destinée à positionner des bits sur un port Dans les deux cas, on se fout complètement de savoir si une valeur se retrouve négative ou pas en fonction des données, et on considère donc toujours qu'on est en non signé (avec ta méthode, ça va modifier les bits si la valeur résultante est négative). Un seul autre cas est d'utiliser de telles fonctions pour expliquer aux débutants comment on représente les données, base 2 ou 16, qui sont parfaitement équivalentes. Là encore, ce qui compte, c'est la représentation des bits telle qu'elle est effectivement en mémoire. Pour Roland Chastain : Si tu veux voir comment on représente les valeurs négatives sur la plupart des processeurs, cherche pour complément à 2. Ce n'est pas la seule méthode possible, mais ses avantages ont conduit à son usage quasi universel (il doit bien encore exister quelques systèmes qui en utilisent une autre, mais je ne les connais pas).
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir. |
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Pendant mes insomnies je lis les anciennes discussions du forum. J'y apprends des tas de choses.
Voyez, au sujet des bases numériques, l'excellente notice de droggo. Cela m'a donné l'idée de faire un programme qui montrerait les étapes du calcul au lieu de donner simplement le résultat.
__________________
L'Art est long et le Temps est court. |
|
|
00
|
|
|
#14 |
|
Expert Confirmé
![]() ![]() Inscription : août 2006 Messages : 3 414 ![]() |
Koe,
Effectivement, tu es remonté assez loin. C'est en fait le petit fichier d'explication que je donne aux élèves qui ont "oublié" comment faire une conversion de base (ça revient régulièrement comme exercice, donc au moins quelques élèves par an
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com