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 :

[Performance] Type int vs type char


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Points : 99
    Points
    99
    Par défaut [Performance] Type int vs type char
    J'ai bien compris les différences, mais je me pose une question au niveau "efficacité" du code compilé.

    Extrait d'un wiki :

    Si vous ne savez pas quel type donner à une variable de type entier, le type int est par défaut le meilleur choix (à condition que votre donnée ne dépasse pas 215-1) : ce type est la plupart du temps représenté au niveau matériel par un « mot machine », c'est-à-dire qu'il est adapté à la taille que la machine peut traiter directement (il fait usuellement 32 bits sur un PC 32 bits, par exemple). Cela permet un traitement plus rapide par le matériel. De plus, beaucoup de bibliothèques (que ce soit celle fournie par le langage C ou d'autres) utilisent ce type pour passer des entiers, ce qui fait que l'utilisation de ces bibliothèques sera plus aisée.
    La plupart du temps, c'est à dire avec les processeurs qui fonctionnent en 16 bits ou plus, c'est bien cela ? (ce qui est le cas sur tous les pc "modernes")
    Plage de valeur minimale garantie pour int selon la norme en complément à 2 (CLP2) : (-2^15 à (2^15) - 1 ) inclus.

    En règle générale si on utilise un type X dont la plage garantie par la norme C est inférieure/supérieure à la plage que peut fournir un "mot machine", on augmente artificiellement le traitement de ce type X, par rapport à si on avait utilisé le type "int" ?
    Mais le programme compilé en C utilise moins/plus de mémoire ?

    J'ai bien conscience qu'il faut avant toute chose utiliser le type approprié, par ex utiliser "int" pour des opérations arithmétiques entières, et "char" pour des caractères. Sous réserve bien sûr que la plage d'utilisation est suffisante.
    Et qu'il y a bien d'autres choses plus importantes à se soucier avant d'en arriver là.

    Mais j'aime bien savoir ce qui se passe, surtout que le C apporte divers niveaux d'abstraction possible, dont un niveau d'abstraction très près de la machine que je n'avais pas encore connu jusque là.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Points : 99
    Points
    99
    Par défaut
    Toujours d'après le même wiki :

    Promotion entière
    La promotion entière, à ne pas confondre avec la conversion automatique de type, fait que tous les types plus petits ou égaux à int (char, short, champs de bits, type énuméré) sont convertis (promus) en int ou unsigned avant toute opération. Ainsi, dans l'exemple suivant, a + b est calculé avec des int et le résultat est de type int :

    short sum(short a, short b) {
    return a + b; /* équivaut à : return (int)a + (int)b; */
    }
    Le compilateur peut émettre un avertissement du fait que le résultat int est converti en short pour être retourné, et cette conversion peut causer une perte de précision (par exemple si int a une largeur de 32 bits et short de 16 bits).

    La promotion se fait vers unsigned lorsqu'un int ne peut pas représenter le type promu.
    Du coup l'utilité de l'utilisation du type short me laisse perplexe.

    Je suppose que cela répond à ma première question, il est plus efficace d'utiliser le type int plutôt que le type short.

    Reste à savoir pour les types plus long tel que long

    Idem, y'a t'il une différence de performance entre les signed et unsigned ?

    (oui j'ai bien conscience que même si différence il y a, elle doit être totalement négligeable et qu'il faut simplement utiliser le type d'entier que l'on a besoin, c'est juste pour savoir)

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par AnozerOne Voir le message
    Idem, y'a t'il une différence de performance entre les signed et unsigned ?
    Oui, à cause de l'extension du bit de signe. Dans le cas d'un signed, si on le copie dans un type plus large (style long) et que le bit de signe est à 1 alors le 1 se propage dans tous les bits ramenés par le long. Afin de conserver la valeur intacte.

    Exemple: signed short=-2 sera codé en binaire/hexa 0xfffe
    Si on le copie dans un long, cela donnera 0xfffffffe

    En revanche, un unsigned short=65534 sera aussi codé en binaire/hexa 0xfffe mais si on le copie dans un long, cela donnera 0x0000fffe

    Or évaluer s'il faut ou pas étendre le dernier "1" prend un temps qui, aussi minime soit-il, n'existe pas dans le cas du unsigned. Donc ce temps gagné, surtout dans une boucle, induira alors un gain de performance.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Points : 99
    Points
    99
    Par défaut
    Ok merci.

    Reste les autres questions ^^

Discussions similaires

  1. Comment convertir un type int en type string
    Par vandeyy dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 05/08/2014, 14h41
  2. conversion champ type int vers type date
    Par Osef95 dans le forum Développement
    Réponses: 4
    Dernier message: 19/12/2012, 10h29
  3. problème de type int - DWORD - const char *
    Par dams77 dans le forum Débuter
    Réponses: 7
    Dernier message: 13/05/2010, 11h21
  4. Réponses: 9
    Dernier message: 06/07/2005, 14h20
  5. Type de colonne : Les char deviennent des VarChar !?
    Par Giovanny Temgoua dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/06/2005, 13h21

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