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 :

Conversion de type .


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut Conversion de type .
    Bonjour,

    je voudrais savoir s'il existe un tableau permettant de savoir quel type donnera l'addition de 2 types différents.
    Par exemple, si j'ai :
    long int li = 1L;
    unsigned int ui = 1U;
    Quel est le type de li + ui ?

  2. #2
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par Premium
    Bonjour,

    je voudrais savoir s'il existe un tableau permettant de savoir quel type donnera l'addition de 2 types différents.
    Peut-être, essayer table + integer promotions + C language sous Google. Dans le même temps, c'est difficile à savoir et cela dépend de l'implémentation, il y a bien des règles de conversions, mais par exemple de nos jours int et long int sont bien souvent la même chose sur pas mal de plateformes.

    Citation Envoyé par Premium
    Par exemple, si j'ai :
    long int li = 1L;
    unsigned int ui = 1U;
    Quel est le type de li + ui ?
    Pas facile. Il faut s'armer de documents rigoureux comme la norme (version de travail ici : http://www.open-std.org/jtc1/sc22/wg...docs/n1124.pdf ) et regarder les §6.3.1.1 §6.3.1.3 et §6.3.1.8. Dans le K&R c'est en annexe A la partie A6 qu'il faut lire attentivement. Penser aussi à regarder la doc. de l'opérateur binaire + et de l'opérateur d'affectation.

    Donc ici ca dépend, si un long int est capable de représenter toutes les valeurs d'un unsigned int dans ton implémentation, alors l'autre opérande sera converti en long et le type de l'expression (li+ui) sera long. Sinon, les 2 opérandes sont convertis en unsigned long et le type de l'expression (li+ui) sera unsigned long.

    Comme souvent, maintenant, long int et int sont sur 32 bits, il y a de fortes chances que ce soit le second cas (expression unsigned long).

    A+

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Pour faire une opération binaire entre deux opérandes de types différents, les opérandes sont converties en un type commun, l'opération peut alors avoir lieu et le résultat est de ce type commun.
    Si les deux opérandes sont un type entier
    - les entiers de taille inférieure à un int sont convertis en int.
    - le type commun est "le plus grand" des deux types entiers concernés ( int , long,...)
    - si une des opérandes est unsigned, le type commun est un type entier unsigned

  4. #4
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par diogene
    Pour faire une opération binaire entre deux opérandes de types différents, les opérandes sont converties en un type commun, l'opération peut alors avoir lieu et le résultat est de ce type commun.
    Si les deux opérandes sont un type entier
    - les entiers de taille inférieure à un int sont convertis en int.
    - le type commun est "le plus grand" des deux types entiers concernés ( int , long,...)
    D'accord.

    Citation Envoyé par diogene
    - si une des opérandes est unsigned, le type commun est un type entier unsigned
    Pas d'accord, si un des opérandes (que j'appelle A) est d'un type signé de rang supérieur à celui non signé (que j'appelle B), et que le type de A est capable de représenter toutes valeurs de B, alors B est converti dans le type de A.

    A+

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Foobar1329
    citation:
    diogene a écrit :
    - si une des opérandes est unsigned, le type commun est un type entier unsigned
    Pas d'accord, si un des opérandes (que j'appelle A) est d'un type signé de rang supérieur à celui non signé (que j'appelle B), et que le type de A est capable de représenter toutes valeurs de B, alors B est converti dans le type de A.
    Je ne crois pas

  6. #6
    Invité
    Invité(e)
    Par défaut
    Dans le livre
    Methodologe de la programmation en C d'Achille Braquelaire, il parle de ces conversions de types. Très bon livre à consulter

  7. #7
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par diogene
    Foobar1329
    Je ne crois pas
    Ce n'est pas moi qui le dit :

    N1124 §6.3.1.8 :

    Otherwise, if the type of the operand with signed integer type can represent all of the values of the type of the operand with unsigned integer type, then the operand with unsigned integer type is converted to the type of the operand with signed integer type.
    A+

Discussions similaires

  1. [DATE][CONVERSION] du type numerique au type date
    Par hamed dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/04/2005, 16h16
  2. Conversion de type
    Par sovitec dans le forum Langage
    Réponses: 5
    Dernier message: 15/12/2004, 14h29
  3. Conversion de type
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 06/07/2004, 10h30
  4. [MYSQL] conversion de type sur import de script
    Par sebos63 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 27/08/2003, 10h00
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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