Partage
  • Partager sur Facebook
  • Partager sur Twitter

Types float et long, unsigned

Les lettres f,l ou u à la fin

Sujet résolu
Anonyme
    27 juin 2007 à 16:14:53

    Bonjour, :)


    J'ai deux questions :
    A quoi servent les lettres f,l et u dans les exemples suivants ?


    float nombre = 5.23f;
    long chiffre = 4L;
    unsigned int nb = 26u;
    unsigned long ex = 46uL;

    Le type des fonctions est déjà précisé, alors je ne vois pas l'utilité! o_O

    Est-ce obligatoire ?

    Il paraît qu'une variable float déclarée sans le f à la fin devient une variable double :o

    Merci d'avance ;)
    • Partager sur Facebook
    • Partager sur Twitter
      27 juin 2007 à 19:28:08

      Non, ce n'est pas obligatoire. Cela seulement permet de préciser le
      type de la constante que tu utilise. Ca peut être utile quand tu
      passe une constante directement à une fonction, vu que le c++
      est trés typé.
      • Partager sur Facebook
      • Partager sur Twitter
        27 juin 2007 à 19:29:46

        D'après moi, si tu as une fonction qui a comme unique paramètre un float et que tu lui passes ça :

        maFonction (2.0);

        2.0 est considéré comme un double et sera donc automatiquement casté lors de l'appel à la fonction en float. Si tu fais :

        maFonction (2.0f);

        Le paramètre sera déjà un float et, par conséquent, non casté.

        Je ne pense pas que la surcharge occasioné par un cast double->float soit très pénalisant niveau performance, en tout cas moi quand j'ai des floats, je spécifie toujours le f à la fin.

        Ici, ce n'est pas très génânt car le cast se fera automatiquement, par contre, ça s'avérera beaucoup plus énervant si tu utilise des templates (heureusement que les messages d'erreur sont assez clairs pour pouvoir résoudre facilement tout ça :)).


        Imagine une classe modèle Vecteur toute simple (je te mets que les variables membres pour rester plus simple) :

        template <typename T>
        class VecteurSimple
        {
           public:
              VecteurSimple (const T ax, const T ay, const T az)
                 : x (ax), y (ay), z (az) {}

              T x, y, z;
        };


        Et que tu souhaites surcharger l'opérateur de multiplication pour multiplier ton vecteur avec un scalaire :

        template <typename T>
        VecteurSimple<T> operator+ (const VecteurSimple<T> & v1, const T scalaire)
        {
           return VecteurSimple (v1.x*scalaire, v1.y*scalaire, v1.z*scalaire);
        }


        Si après, quand tu utilises tes vecteurs, tu fais ça :

        VecteurSimple <float> v (1.0f, 2.0f, 3.0f);
        VecteurSimple <float> v2 = v * 2.0;


        Ben ça ne compilera pas :).

        En effet, à la compilation le compilo ne saura pas s'il doit instancier avec des float (c'est le type de notre vecteur v) ou des double (c'est le type de 2.0).

        La possibilité pour résoudre ça c'est d'écrire 2.0f au lieu de 2.0 ou soit de définir un second paramètre template pour le scalaire afin qu'il puisse être d'un type différent de T. C'est la solution que j'utilise, au moins ça te permet de faire VecteurSimple <float> = v * 2 (ou * 2.0, ou * 2.0f...)
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          27 juin 2007 à 20:27:59

          Merci :) .Même si je ne sais pas vraiment ce que sont les templates et comment définir des classes (ca ressemble vraiment pas à la syntaxe php pour les classes :-° ), je comprends l'idée générale.
          Par défaut, une variable "décimale" est un double, une variable entière un int. Donc si on ne précise pas que ce soit un long ou un float, la variable est ramenée à son type par défaut :magicien:

          Donc ca doit être vraisemblablement la même chose pour unsigned, ca doit être ramené à signed.

          Par contre, je vois pas quelle différence cele fait par rapport à une variable classique si elle est finie comme constante. Elle sera "castée" dans les même conditions, non ?


          Ah oui : En C, 2.0 était considéré comme un double si on ne mettait pas le f après ?


          PS : C'est bizzare, mon compte se déconnecte tout seul au bout de 30 seconde... :(
          • Partager sur Facebook
          • Partager sur Twitter
            27 juin 2007 à 20:43:21

            Citation : Pas de titre

            Même si je ne sais pas vraiment ce que sont les templates et comment définir des classes (ca ressemble vraiment pas à la syntaxe php pour les classes :-° ), je comprends l'idée générale.


            Ne t'inquiète pas, les templates c'est pas ce qu'il y a de plus urgent à apprendre :p.

            Citation : Pas de titre

            Par défaut, une variable "décimale" est un double, une variable entière un int. Donc si on ne précise pas que ce soit un long ou un float, la variable est ramenée à son type par défaut :magicien:


            Je pense oui.

            Citation : Pas de titre

            Par contre, je vois pas quelle différence cele fait par rapport à une variable classique si elle est finie comme constante. Elle sera "castée" dans les même conditions, non ?


            Je comprends pas ce que tu veux dire. Si c'est une variable constante de type double et que tu la passe à une fonction qui accepte des float, oui elle sera castée j'imagine.

            Citation : Pas de titre

            Ah oui : En C, 2.0 était considéré comme un double si on ne mettait pas le f après ?



            Jamais fait de C, mais je pense que ça fonctionne pareil :).
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              28 juin 2007 à 12:41:55

              Ok :)

              Au sujet des constantes, je me demandais juste pourquoi tu utilisais des constantes dans ton code, si ele changeait quelque chose par rapport au cast ^^ . Comme en plus, magmanime parlait de constante, je commençais à penser que cela avait une influence :euh:

              Merci beaucoup
              • Partager sur Facebook
              • Partager sur Twitter
                28 juin 2007 à 14:19:54

                Citation : Zandramas

                Ok :)

                Au sujet des constantes, je me demandais juste pourquoi tu utilisais des constantes dans ton code, si ele changeait quelque chose par rapport au cast ^^ . Comme en plus, magmanime parlait de constante, je commençais à penser que cela avait une influence :euh:

                Merci beaucoup
                Quand je parlais de constantes, je parlais des: 5.23f, 4L, 26u, 46uL.
                • Partager sur Facebook
                • Partager sur Twitter

                Types float et long, unsigned

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown