Convertir de décimal à hexadécimal

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Existe-t-il une fonction déjà implémentée en C pour convertir un nombre de la base 10 vers la base 16 ?

#include <stdio.h>

int main()
{
    int i = 14;

    printf("Nombre %i en base 16 : %i", i, i);
    return 0;
}

Si oui, quel #include utiliser ?
Mes recherches me donnent uniquement des fonctions très longues écrites par d’autres programmeurs.
Je cherche une solution facile.

Si tu veux simplement afficher en hexa tu peux utiliser l’affichage avec %x au lieu de %i.

Après si tu veux vraiment manipuler des hexa il y a surement moyen mais je n’ai pas d’idée immédiate.

#include <stdio.h>

int main()
{
    int i = 26;

    printf("Nombre %i en base 16 : %x", i, i);
    return 0;
}

Nombre 26 en base 16 : 1a

Salut,

Alors pour information le nombre i n’est ni en base 10 ni en base 16, c’est simplement un nombre entier, indépendant de toute base.

La base n’intervient que lorsque tu souhaites obtenir une représentation de ton nombre (pour l’afficher par exemple), mais il n’y a pas de conversion à faire : il faut simplement traiter ton nombre de façon à obtenir des chiffres hexadécimaux plutôt que décimaux (le flag %x de printf répond à cela).

Toute petite note.

Généralement, quand on parle de conversion, c’est dans la manière de stocker les données.

Sur nos ordinateurs, c’est la représentation binaire qui est par défaut et optimale. C’est la représentation de l’ordinateur. Il ne me semble pas que ce soit spécifié dans les normes.

On peut représenter les données dans toutes les bases. Par exemple :

 char c[2] = "A0"; // Base 16

Ici, on a un nombre codé sur 2 octets en base hexadécimale représentant 176 en base décimale. Mais généralement manipuler cette représentation est plus lente que d’utiliser un int. Elle permet cependant de manipuler des nombres de dimention arbitraire.

+0 -0

Non non, si tu mets 3 ou que tu ne mets rien, tu as une chaine de caractères, et ça fait 3 octects.

S’il n’y a pas la place de stocker le '\0' alors il n’est tout simplement pas stocké. C’est écrit quelque part dans la norme du langage C je crois. Par contre, le type, c’est char et pas char*.. Je corrige.

+0 -0

Ici, on a un nombre codé sur 2 octets en base hexadécimale représentant 176 en base décimale. Mais généralement manipuler cette représentation est plus lente que d’utiliser un int. Elle permet cependant de manipuler des nombres de dimention arbitraire.

En pratique, personne ne fait ça. C’est un gâchis énorme de mémoire et de ressources CPU. Quand on a besoin de manipuler des très grands nombres, on colle juste plusieurs entiers les uns aux autres (qui sont alors stockés en binaire, mais ça on s’en moque à la limite). L’implémentation des opérations est alors beaucoup plus simple et on ne gaspille pas de la RAM. Et à l’inverse, si on a besoin de tout petits nombres parce qu’on travaille sur une machine limité, on peut se servir d’un char pour stocker, encore une fois en binaire, un entier sur un seul octet.

+1 -0

Salut,

S’il n’y a pas la place de stocker le '\0' alors il n’est tout simplement pas stocké. C’est écrit quelque part dans la norme du langage C je crois.

ache

Tu crois ? :p
Pour info, la norme ne dit rien à ce sujet, elle détaille uniquement ce qu’il se passe quand il y a trop peu d’éléments (initialisation des éléments restants comme ceux de classe de stockage statique). Cela étant, ce n’est pas un comportement indéfini, donc c’est « permi », mais c’est moche, préfère plutôt ceci : char c[] = { 'A', '0' };.

+1 -0

Tu crois ? :p
Pour info, la norme ne dit rien à ce sujet, elle détaille uniquement ce qu’il se passe quand il y a trop peu d’éléments (initialisation des éléments restants comme ceux de classe de stockage statique). Cela étant, ce n’est pas un comportement indéfini, donc c’est « permi », mais c’est moche, préfère plutôt ceci : char c[] = { 'A', '0' };.

Taurre

Mais euh :(
Du coup, j’ai vérifié ^^

An array of character type may be initialized by a character string literal, optionally enclosed in braces. Successive characters of the character string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

C99 §6.7.8 - 14

Il y a un exemple un peu plus loin dans :

EXAMPLE 8 The declaration

char s[] = "abc", t[3] = "abc";

defines "plain" char array objects s and t whose elements are initialized with character string literals. This declaration is identical to

char s[] = { 'a', 'b', 'c', '\0' },
     t[] = { 'a', 'b', 'c' };

C99, §6.7.8 - 32

Je déteste contredire les gens mais ça me semble plutôt bien défini.

+0 -0

Aah ! Tiens, intéressant, j’ai zappé ce passage alors pourtant que j’ai regardé au même endroit que toi. :honte:
Merci pour l’info, du coup. ^^

Je déteste contredire les gens mais ça me semble plutôt bien défini.

ache

Il ne faut pas hésiter à contredire les gens quand ils ont torts, même s’ils ont rédigés un cours sur le C. :p

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte