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

C Discussion :

Un char en Int


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Par défaut Un char en Int
    Bonjour,

    Je me permet de faire appel à vos lumières car je sèche sur un petit point fort ennuyeux.

    + E->PostalCode est un entier (int) de 4 octets valant 66666
    + PostalCode_char est un pointeur vers char de 4 octets (PosalCode_char[4])

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sprintf (PostalCode_char,"%d",E->PostalCode);
    printf("%i\r\n",strlen(PostalCode_char));
    printf("%i\r\n",sizeof(PostalCode_char));
    + Ce code me renvoie : 6 et 4 donc il convertit 66666 en {'6','6','6','6','6','\0'}. + Cependant, je n'ai que 4 octets dans ma chaine d'où un débordement.

    J'aimerais pouvoir transtyper l'int 66666 en char de 4 octets (comme l'int utilisé) et pouvoir aussi faire l'opération inverse.

    D'avance merci

    Altrensa

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Euh... tu as la réponse dans ta question.
    Il n'est pas possible de mettre "66666" dans un tableau de caractères de 4 octets, comme tu le dis toi-même: {'6','6','6','6','6','\0'}.
    Et ne cherches pas à caster ton entier en char*, ça te donnera une chaîne de caractères complétement stupide...
    Agrandis ta chaîne PostalCode_char à 6 octets. Point.

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par Altrensa Voir le message
    + PostalCode_char est un pointeur vers char de 4 octets (PosalCode_char[4])
    Stop, un pointeur est effectivement generalement une variable stoquée sur 4 octets, mais on dirait que c'est plutot un tableau de 4 elements. Donc pointeur ou tableau?
    Nous donner la definition de ta structure serait mieux.

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Par défaut
    Bonjour,

    En fait, quand je fait sizeof(int), j'obtiens 4 même si mon int est 66666. Ensuite, je veux faire un transtypage en char[4] (chaine de caractère de 4 octets) qui fait théoriquement la même longueur. Je veux aussi pouvoir faire l'opération inverse.

    D'avance merci

    Altrensa

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    o_O
    Je crois que tu n'as pas bien compris le principe de sizeof() et de int...
    Un int c'est une variable qui fait 4 octets et qui peut contenir des nombres allant de -2.147.483.648 à 2.147.483.647, la taille retournée par sizeof() ce n'est pas le nombre de chiffres que contient l'entier ! C'est la taille que prend l'entier en mémoire. Le nombre est codé sous forme binaire, voilà une petite table de conversion pour te montrer le principe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    0000 = 0
    0001 = 1
    0010 = 2
    0011 = 3
    0100 = 4
    ...
    sizeof() ne te donne donc pas le nombre de chiffres de ton entier !

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Altrensa Voir le message
    + E->PostalCode est un entier (int) de 4 octets valant 66666
    <hors-sujet grave>
    Erreur de spécification. Un champ 'code postal' doit être une chaine et non une valeur numérique. Il n'y a aucun calcul à faire avec, par contre, un tri est intéressant.
    </hors-sujet grave>

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Par défaut
    Bonjour,

    Je pense que je dois mal m'exprimer. Tout d'abord, je sais que le sizeof(int) donne la taille en octets de la mémoire allouée à l'int. Donc j'ai un int, qui vaut 66666 et qui prend 4 octets en mémoire. Ensuite, dans le sujet (de TP donc non modifiable) qui m'intéresse, cet int (le code postal qui est donc déclaré ainsi et donc non modifiable) doit être concaténer dans une chaine de caractères. Cependant, il y a comme espace disponible l'espace alloué à un int c'est à dire 4 octets. Je dois donc en faire une chaine de : PostalCode_char[4].

    Mon problême est simplement de pouvoir passer de cette valeur int (de 4 octets) en une chaine de 4 octets et de pouvoir aussi faire l'opération inverse...

    D'avance merci.

    PS : Il n'y a pas un truc avec des décalages et des masques pour traduire l'entier en 4 octets d'une chaine...

    Altrensa

  8. #8
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    bonjour,

    ton int sur ton systeme fait 4 octets.
    Ton prof veut stocker ca dans un tableau de char de 4 elements (4 * 8 = 32)

    un code du genre (n'est pas du tout optimisé ni peut etre tres intelligent mais doit correspondre a ce que ton prof veut vous montrer ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
                  int avant = 32000;
                  int apres = 0;
                  /* ci apres, c est genant de mettre 4 en dur, le C ne garanti pas que un int est code sur 4 octets, 
                  ** il vaudrait mieux faire  :
                  ** char* pendant = malloc( sizeof( avant ) ); 
                  ** avec le free qui va bien avant de sortir
                  */
                  char pendant[ 4 ] = { 0 }; 
     
                  memcpy( pendant, &avant, sizeof( avant ) );
                  memcpy( &apres, pendant, sizeof( avant ) );
     
                  printf( "VALEUR FINALE : %d\n", apres );
    tout ca pour dire que le type est independant de la maniere dont sont codees les informations.
    En C une suite binaire restera immuable (sauf intervention du programmeur bien sur, par des operations, decalage des bits...).

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Altrensa Voir le message
    Bonjour,

    Je pense que je dois mal m'exprimer. Tout d'abord, je sais que le sizeof(int) donne la taille en octets de la mémoire allouée à l'int. Donc j'ai un int, qui vaut 66666 et qui prend 4 octets en mémoire. Ensuite, dans le sujet (de TP donc non modifiable) qui m'intéresse, cet int (le code postal qui est donc déclaré ainsi et donc non modifiable) doit être concaténer dans une chaine de caractères. Cependant, il y a comme espace disponible l'espace alloué à un int c'est à dire 4 octets. Je dois donc en faire une chaine de : PostalCode_char[4].

    Mon problême est simplement de pouvoir passer de cette valeur int (de 4 octets) en une chaine de 4 octets et de pouvoir aussi faire l'opération inverse...

    D'avance merci.

    PS : Il n'y a pas un truc avec des décalages et des masques pour traduire l'entier en 4 octets d'une chaine...

    Altrensa
    Il me semble que tu confonds pleins de choses. Il n'est pas possible de représenter la valeur 66666 sous forme d'une chaine de caractères occupant 4 bytes en mémoire. D'ailleurs, il n'est pas garantit que la valeur 66666 puisse être représentée par un int. L'usage d'un long est plus approprié ici.

    Je pense que la question n'est pas de représenter 66666 sous forme d'une chaine de caractère, mais de stocker la valeur binaire de 6666 dans un tableau de unsigned char, par exemple en vue d'une sauvegarde dans un fichier binaire. Dans ce cas, j'y vois plus clair et je propose le code suivant:

    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
    #include <stdio.h>
    #include <limits.h>
     
    #define MASK ((unsigned char) ~0u)
     
    void afficher_bytes(unsigned char *b, size_t taille);
     
    int main(void)
    {
        unsigned char bytes[4] = {0};
        /* -tc- un entier de type int n'est pas assure de pouvoir représenter une
           valeur supérieure à 32767 */
        long code_postal = 66666;
        size_t i;
     
        /* -tc- on utilise une representation petit boutiste */
        for (i = 0; i < sizeof bytes; i++)
        {
            bytes[i] = ((unsigned long) code_postal >> CHAR_BIT * i) & MASK;
        }
     
        afficher_bytes(bytes, sizeof bytes);
     
        return 0;
    }
     
    void afficher_bytes(unsigned char *b, size_t taille)
    {
        if (b != NULL && taille > 0)
        {
            int i;
     
            printf("(MSB) ");
            for (i = taille - 1; i >= 0; i--)
            {
                printf("%02X ", (unsigned) b[i]);
            }
            printf("(LSB)\n");
        }
    }
    Not 1: byte != octet. Un byte est assuré de faire au moins 8 bits. Pour être portable, je recommande l'usage de CHAR_BIT.

    Note 2: Ici, je n'ai pas transformé l'entier int en une chaine, j'ai stocké la représentation binaire d'un entier dans un tableau de bytes (unsigned char).

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Note 1 : le byte n'est pas assuré du tout de faire au moins 8 bits, il peut en faire moins aussi... Il existe des bytes de 6 ou 7 bits aussi...

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par PsychoH13 Voir le message
    Note 1 : le byte n'est pas assuré du tout de faire au moins 8 bits, il peut en faire moins aussi... Il existe des bytes de 6 ou 7 bits aussi...
    La norme assure 8 bits minimum au paragraphe §5.2.4.2.1. Donc avec un compilateur conforme, un byte fait au moins 8 bits.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par PsychoH13 Voir le message
    Note 1 : le byte n'est pas assuré du tout de faire au moins 8 bits, il peut en faire moins aussi... Il existe des bytes de 6 ou 7 bits aussi...
    Non, pas en C. La norme impose 8 minimum.

Discussions similaires

  1. Convertion char vers int
    Par barthelv dans le forum C
    Réponses: 8
    Dernier message: 08/10/2011, 21h45
  2. [Debutant] conversion de char en int
    Par Marc_3 dans le forum Langage
    Réponses: 9
    Dernier message: 31/08/2011, 12h02
  3. transformer un char en int
    Par transistor49 dans le forum C
    Réponses: 7
    Dernier message: 13/12/2005, 21h47
  4. [Conversion]Convertir un char[] en int
    Par ThanosT dans le forum Général Java
    Réponses: 10
    Dernier message: 11/11/2005, 12h23
  5. "Conversion" d'un char en int ou longueur
    Par Michaël dans le forum C
    Réponses: 6
    Dernier message: 15/08/2003, 11h40

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