IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Conversion base 2 >> base 10 >> hexadécimal


Sujet :

x86 32-bits / 64-bits Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut Conversion base 2 >> base 10 >> hexadécimal
    Bonsoir, à tous,

    Je lis ce tutoriel: http://www.iprezo.org/index.php?page=asm

    Et j'esn suis au chapitre II, les nombre binaire, décimaux, hexadécimaux.

    Cependant je n'ai absolument pas compris le principe pour convertir un nombre décimal en binaire.

    Par exemple, que vaut le nombre: 47 en binaire, quel est la marche à suivre ?

    Merci beaucoup !

    PS: Je lis ce tuto pour apprendre l'ASM en général, l'ASM servant par exemple é développer des micro-OS, est-ce un bon choix ?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Bonjour,

    Citation Envoyé par devatt Voir le message
    Cependant je n'ai absolument pas compris le principe pour convertir un nombre décimal en binaire. Par exemple, que vaut le nombre: 47 en binaire, quel est la marche à suivre ?
    D'une manière générale, il faut prendre le nombre et le « digérer » en faisant des divisions successives par la base dans laquelle tu veux le convertir. Chaque reste te donne un chiffre. En binaire, on va donc diviser successivement par deux, d'où les termes « dichotomies successives ». De tête, on peut dire que 47d = 101111b. Vérifions si c'est vrai :

    47d ÷ 2 = 23, reste 1 ;
    23d ÷ 2 = 11, reste 1 ;
    11d ÷ 2 = 5; reste 1 ;
    5d ÷ 2 = 2; reste 1 ;
    2d ÷ 2 = 1; reste 0;
    1d ÷ 2 = 0; reste 1;

    En remontant les restes de bas en haut, tu trouves le résultat escompté, et ça marche avec toutes les bases. En binaire en particulier, maintenant, les poids successifs de chaque rang (bit) sont les puissances de deux :

    32768 16384 8192 4096 - 2048 1024 512 256 - 128 64 32 16 - 8 4 2 1

    Il est utile de les connaître par cœur (au moins les huit premières) avec leurs positions, car on s'en sert en permanence en informatique. Ici, 47 = 32+15 = 32+8+4+2+1, soit 101111. Le compte est bon.

    PS: Je lis ce tuto pour apprendre l'ASM en général, l'ASM servant par exemple à développer des micro-OS. Est-ce un bon choix ?
    Qu'est-ce qui est un bon choix ? Le tutoriel ou les micro-OS ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut
    Merci beaucoup obsidian,

    donc par exemple: 87 =

    87 / 2 = 43 reste 1
    43 / 2 = 21 reste 1
    21 / 2 = 10 reste 1
    10 / 2 = 5 reste 0
    5 / 2 = 2 reste 1
    2 / 2= 1 reste 0
    1 / 2 = 0 reste 1

    donc c'est égal à 1110101b ? Pfiou c'est formidable ! Mais j'ai vu quelque part d'un nombre binaire est réprsenté sur 8 bits, donc 8 chiffres, pourquoi on en obtient moins ?

    Et donc -87 = 10101111b ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Qu'est-ce qui est un bon choix ? Le tutoriel ou les micro-OS ?
    Je parlais du tutoriel.

    Merci d'avance !

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Bia,

    Non, 87 décimal = 1010111b (il faut prendre les restes obtenus dans l'ordre inverse).

    Non, un nombre en bianire ne fait pas 8 bits. 8 bits, c'est pour un octet.
    Le nombre de bits dépend du type utilisé pour le nombre (8, 16, 32 ... bits).
    Si la conversion en donne moins, on complète avec des 0 à gauche.

    Voici la copie d'une explication que j'ai écrite depuis longtemps pour expliquer rapidement comment changer de base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    Calcul dans différentes bases
     
    Conventions
     
    Dans tout ce document, on va utiliser les notations suivantes:
     
    Le symbole ^ signifie 'élever à la puissance'
    par exemple 10^3 signifie 'élever 10 à la puissance 3' c'est à dire 10*10*10 = 1000
     
    Un nombre suivi par
    #B est écrit en base 2  (B pour binaire)
    #H est écrit en base 16 (H pour Hexadécimal)
    sans précision, il est écrit en base 10
     
    Le symbole * signifie 'multiplier'
     
    Dans les calculs, pour les divisions :
      Q signifie Quotient
      R signifie Reste
     
    Rappel : Tout nombre élevé à la puissance 0 (zéro) vaut 1
    (10^0 = 2^0 = 16^0 = 1)
     
     
     
    Quand nous écrivons un nombre, par exemple 573, cela signifie qu'il est égal à la somme:
     
      3 * 10^0  = 3*1    =    3
    + 7 * 10^1  = 7*10   =   70
    + 5 * 10^2  = 5*100  =  500
                           -----
                            573
     
     
    On peut transcrire cela dans une autre base, par exemple en base 2
     
    On ne disposera alors que de 2 symboles, 0 et 1.
    Les chiffres en partant de la DROITE signifieront :
    0 ou 1 * 2^0
             2^1
             2^2
             2^3
             etc...
     
    Soit le nombre 1000111101#B, calculons sa valeur en base 10
     
      1 * 2^0  = 1
    + 0 * 2^1  = 0
    + 1 * 2^2  = 4
    + 1 * 2^3  = 8
    + 1 * 2^4  = 16
    + 1 * 2^5  = 32
    + 0 * 2^6  = 0
    + 0 * 2^7  = 0
    + 0 * 2^8  = 0
    + 1 * 2^9  = 512
                -----
                 573
     
    On peut utiliser une autre base, 16.
    Il nous faut alors 16 symboles pour représenter les différents 'chiffres'.
    Par convention, on a choisi d'utiliser 0 à 9, puis A à F
     
    A vaut donc 10 (décimal)
    B = 11
    C = 12
    D = 13
    E = 14
    F = 15
     
    Avec le même principe que pour la base 2, voyons le nombre 23D#H
     
      D * 16^0 =  13
    + 3 * 16^1 =  48
    + 2 * 16^2 = 512
                -----
                 573
     
    Le passage d'une base quelconque en base 10 est donc très simple.
     
     
     
     
    Voyons maintenant comment passer de la base 10 à une autre, exemple en base 16.
     
    La technique suivante permet de trouver les chiffres successifs en partant de la DROITE.
     
    soit le nombre 573.
    Divisons le par la base destination, soit 16
    573 / 16 = 35(Q) + 13(R)
      le reste = 13 = D#H est le premier chiffre à droite de la valeur cherchée
     
    répétons le calcul avec le quotient du calcul précédent (35)
    35 / 16 = 2(Q) + 3(R)
      le reste = 3 = 3#H est le deuxième chiffre en partant de la droite
     
    et encore une fois :
    2 / 16 = 0(Q) + 2(R)
      le reste = 2 = 2#H est le troisième chiffre en partant de la droite
     
    Comme le quotient = 0, on peut arrêter.
     
    Le nombre 573 s'écrit donc 23D#H
     
    En supprimant les commentaires, on obtient une disposition claire:
     
              (Q)   (R)   (R en base 16)
    573 / 16 = 35 + 13      D
     35 / 16 =  2 +  3      3
      2 / 16 =  0 +  2      2
     
      On lit les restes de bas en haut = 23D#H
     
     
    Refaisons le calcul pour écrire 573 en base 2
     
              (Q)    (R)
    573 / 2 = 286   + 1
    286 / 2 = 143   + 0
    143 / 2 =  71   + 1
     71 / 2 =  35   + 1
     35 / 2 =  17   + 1
     17 / 2 =   8   + 1
      8 / 2 =   4   + 0
      4 / 2 =   2   + 0
      2 / 2 =   1   + 0
      1 / 2 =   0   + 1
     
      terminé puisque le quotient = 0
     
      et donc en lisant les restes de bas en haut, la valeur est 1000111101#B
     
     
    Voilà, j'espère que c'est assez clair.
    J'espère que ça t'aidera.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par devatt Voir le message
    donc c'est égal à 1110101b ?
    Comme on te l'a dit, il faut remonter de bas en haut, donc : « 1010111 ».

    Pfiou c'est formidable ! Mais j'ai vu quelque part d'un nombre binaire est réprsenté sur 8 bits, donc 8 chiffres, pourquoi on en obtient moins ?
    Non, un nombre binaire s'écrit comme un nombre décimal. Ce sont les octets des mémoires des ordinateurs qui contiennent huit bits en particulier. Dans ce cas, les bits surnuméraires forment des zéros non-significatifs. Ainsi « 1010111 = 01010111 », de la même façon que « 87 = 00087 » en décimal.

    Et donc -87 = 10101111b ?
    Là, pas du tout. Pour obtenir la valeur négative d'un nombre binaire, soit on y colle un signe comme en décimal quand on travaille sur papier, soit on utilise le binaire naturel et là, il faut inverser la valeur de tous les bits (mais en conservant leur ordre), puis ajouter 1 à la valeur obtenue.

    Le fait que cette nouvelle valeur puisse être considérée comme un binaire négatif s'explique de la même façon que « 9999999 » sur un compteur kilométrique peut être interprété comme « -1 km ».

  6. #6
    Invité de passage
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1
    Par défaut super sujet. si je comprends bien :
    Citation Envoyé par Obsidian Voir le message
    Comme on te l'a dit, il faut remonter de bas en haut, donc : « 1010111 ».



    Non, un nombre binaire s'écrit comme un nombre décimal. Ce sont les octets des mémoires des ordinateurs qui contiennent huit bits en particulier. Dans ce cas, les bits surnuméraires forment des zéros non-significatifs. Ainsi « 1010111 = 01010111 », de la même façon que « 87 = 00087 » en décimal.



    Là, pas du tout. Pour obtenir la valeur négative d'un nombre binaire, soit on y colle un signe comme en décimal quand on travaille sur papier, soit on utilise le binaire naturel et là, il faut inverser la valeur de tous les bits (mais en conservant leur ordre), puis ajouter 1 à la valeur obtenue.

    Le fait que cette nouvelle valeur puisse être considérée comme un binaire négatif s'explique de la même façon que « 9999999 » sur un compteur kilométrique peut être interprété comme « -1 km ».
    ..............................

    donc si je comprends bien :10101111 en négatif corespond à :


    101010000

    merci de bien vouloir me corriger.

  7. #7
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    Citation Envoyé par bleublanc Voir le message
    donc si je comprends bien :10101111 en négatif corespond à :

    101010000

    merci de bien vouloir me corriger.
    Deux nombres binaires sont égaux s'ils sont identiques bit à bit.

    On pourrait ajouter qu'il faut aussi que le "contexte" dans lequel ils sont interprétés soit le même: s'ils sont identiques bit à bit mais que l'un est interprété comme un nombre signé alors que l'autre est non signé, les deux nombres sont alors différents.

    Il faut aussi indiquer sur combien de bits se fait la représentation. Comme l'indiquait Obsidian, on regroupe les bits par paquets de 8 bits (8, 16, 32 ,64, etc.).

    On peut donc dire que 10101111 et 0000000010101111 sont différents si les deux sont traités en nombre signés: celui sur 8 bits à un bit de signe et l'autre - sur 16 bits - non.

Discussions similaires

  1. [AC-2010] conversion d´une base Access en une base Access web
    Par Bubar49 dans le forum Access
    Réponses: 0
    Dernier message: 03/05/2012, 12h46
  2. [OpenOffice][Base de données] Conversion, exportation d'open-office base et calc vers Mysql.
    Par Invité dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 14/05/2010, 08h16
  3. Réponses: 5
    Dernier message: 06/01/2010, 11h24
  4. Probleme conversion fichier provenant d'une base oracle vers une base mysql
    Par jonnyboy dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 18/06/2009, 09h40
  5. Conversion d'entier en base 2^32 vers base 10
    Par le_duche dans le forum C++
    Réponses: 4
    Dernier message: 23/08/2008, 23h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo