Partage
  • Partager sur Facebook
  • Partager sur Twitter

integer et char...

    18 juillet 2023 à 3:27:27

    Bonjour.
    question bette mais je ne sais pas la reponse.
    pourquoi je dois savoir qu'une variable Integer et entre -32 768 à 32 767 ?

    ca veut dire quoi -32 768 à 32 767 ? la taille memoire ? ou la valeur maximale que je peux ecrire ?

    et pour char -128 à 127 ???

    • Partager sur Facebook
    • Partager sur Twitter
      18 juillet 2023 à 9:02:51

      Salut,

      Valeur maximale.

      Un peu comme si dans un cahier tu prenais 4 carreaux, on pourrait te dire que tu peux écrire des nombres de 0 à 9999

      Après, t'es pas obligé d'apprendre les nombres par coeur.

      -
      Edité par Fvirtman 18 juillet 2023 à 9:03:07

      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        18 juillet 2023 à 10:12:30

        SamuelAlgeski a écrit:

        pourquoi je dois savoir qu'une variable Integer et entre -32 768 à 32 767 ?

        Il y a plusieurs type d'integer (entier), int, short, long, unsigned int ... Ils n'ont pas tous la même plage de valeurs et peuvent varier selon les machines.

        Leur taille on les exprimes souvent en octets ou en bits.

        Plus de détail ici : https://fr.cppreference.com/w/cpp/language/types

        • Partager sur Facebook
        • Partager sur Twitter
        ...
          18 juillet 2023 à 11:10:18

          Accessoirement c'est "erroné", les domaines de définition des divers types d'entiers dépendent des machines, des compilateurs, des options de compilation, etc.

          p.ex. -32k..+32k c'est pour les entiers signés 16bits: std::int16_t. Sur l'ensemble des machines classiques contemporaines, cela correspond aux short. Mais dans un plus lointain passé, cela concernait aussi int, qui aujourd'hui est **généralement** sur 32bits...

          Beaucoup de cours se sentent obligés de régurgiter ces valeurs non portables en tout début.

          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            18 juillet 2023 à 13:03:59

            SamuelAlgeski a écrit:

            Bonjour.
            question bette mais je ne sais pas la reponse.
            pourquoi je dois savoir qu'une variable Integer et entre -32 768 à 32 767 ?

            ca veut dire quoi -32 768 à 32 767 ? la taille memoire ? ou la valeur maximale que je peux ecrire ?

            et pour char -128 à 127 ???

            Vous devez faire semblant de le savoir si vos connaissances sont évaluées par le même type incompétent qui vous raconte ça en cours, pour avoir une bonne note. A part ça, c'est faux.

            1. Les valeurs limites pour le type int, ça dépend de la représentation choisie pour les entiers sur votre matériel, avec un certain compilateur et certaines options par défaut.

            Tout ce qu'on peut en dire, c'est que pour un environnement donné, les valeurs d'un entier de type int sont comprises entre les deux constantes INT_MAX et INT_MIN.

            A ne pas confondre avec le fait que  la norme du langage C impose que la fourchette de valeurs pour int contienne au moins l'intervalle -32 767 à 32 767, qui correspond aux valeurs pour les entiers  sur 16 bits.

            Attention, +32 767 pas 32 768.  La norme ne dit pas que les entiers ont une représentation en complément à 2, et donc les entiers sur 16 bits peuvent être composés d'un bit de signe et d'une valeur absolue sur 15 bits allant de 0 à 32767.

            En gros, la conséquence pratique c'est que si vous avez le bonheur de programmer en C sur un microcontrolleur ou ordinateur vintage (PDP 8 !) à mots de 12 bits, ou un microprocesseur 8 bits, un int ne sera pas représenté sur 12 bits, ni sur 8.

            2. La norme C laissant toute latitude pour que le type char corresponde à unsigned char ou signed char, les limites de char ne sont pas définies.

            Voir l'annexe E de la norme C17

            #define CHAR_BIT 8
            #define CHAR_MAX UCHAR_MAX or SCHAR_MAX
            #define CHAR_MIN 0 or SCHAR_MIN
            #define INT_MAX +32767
            #define INT_MIN -32767
            #define LONG_MAX +2147483647
            #define LONG_MIN -2147483647
            #define LLONG_MAX +9223372036854775807
            #define LLONG_MIN -9223372036854775807
            #define MB_LEN_MAX 1
            #define SCHAR_MAX +127
            #define SCHAR_MIN -127
            #define SHRT_MAX +32767
            #define SHRT_MIN -32767
            #define UCHAR_MAX 255
            #define USHRT_MAX 65535
            #define UINT_MAX 65535
            #define ULONG_MAX 4294967295
            #define ULLONG_MAX 18446744073709551615


            qui donne les valeurs minimales requises pour une implémentation valide de C.


            ref: p 368 de https://files.lhmouse.com/standards/ISO%20C%20N2176.pdf




            -
            Edité par michelbillaud 18 juillet 2023 à 13:26:06

            • Partager sur Facebook
            • Partager sur Twitter
              18 juillet 2023 à 13:58:35

              > Attention, +32 767 pas 32 768. La norme ne dit pas que les entiers ont une représentation en complément à 2,

              Cela a changé en C23 et C++20: les entiers doivent être en complément à 2 pour respecter la norme: https://en.cppreference.com/w/cpp/language/types#Range_of_values

              Si je me souviens du papier d'origine, ce changement est fait parce que 1) tous les compilateurs le font 2) ceux qui ne le font pas ont pour cible des architectures qui n'existent plus depuis longtemps. En gros, normaliser un état de fait.

              Savoir que les entiers ont des tailles limites, c'est bien. Mais à moins d'utiliser de grande valeur (plusieurs millions) et sur des machines spécifiques, on se contente d'utiliser int sans prise de tête. Puis long long quand c'est un peu short.

              • Partager sur Facebook
              • Partager sur Twitter
                19 juillet 2023 à 2:47:13

                #define CHAR_BIT 8
                #define CHAR_MAX UCHAR_MAX or SCHAR_MAX
                #define CHAR_MIN 0 or SCHAR_MIN
                #define INT_MAX +32767
                #define INT_MIN -32767
                #define LONG_MAX +2147483647
                #define LONG_MIN -2147483647
                #define LLONG_MAX +9223372036854775807
                #define LLONG_MIN -9223372036854775807
                #define MB_LEN_MAX 1
                #define SCHAR_MAX +127
                #define SCHAR_MIN -127
                #define SHRT_MAX +32767
                #define SHRT_MIN -32767
                #define UCHAR_MAX 255
                #define USHRT_MAX 65535
                #define UINT_MAX 65535
                #define ULONG_MAX 4294967295
                #define ULLONG_MAX 18446744073709551615

                si j'ai bien compris de ce tableau c'est que ces valeurs sont des valeurs minimal requis pour une implémentation correcte de langage C cela dit pour les vieux ordinateur... mais si j'ai un PC Intel i7 ... avec 16go de ram donc la valeur max sera plus grande.

                Question: mais pourquoi ils font des valeurs INT_MAX, pas besoin de mentionné la valeur INT_MAX car la mémoire décidera la valeur maximal de INT non ?
                • Partager sur Facebook
                • Partager sur Twitter
                  19 juillet 2023 à 4:06:09

                  Oui, ce sont les valeurs minimal requise. Au début du lien que j'ai passé, il y a un tableau indiquant les tailles selon des modèles de donnée. Maintenant, on est sur des processeurs 64bits avec un modèle LLP64 (Window) ou LP64 (Linux), mais même en 32bits, les int était principalement sur 4 octets (alors que le standard demande au minium 2).

                  > Question: mais pourquoi ils font des valeurs INT_MAX, pas besoin de mentionné la valeur INT_MAX car la mémoire décidera la valeur maximal de INT non ?

                  Ce sont des constantes faciles à utiliser dans le cas où on a besoin de connaître les limites des entiers. Par exemple, dans une fonction qui transforme les chaînes de caractères en entier, on veut connaître cette limite pour indiquer que la chaîne n'est pas convertible parce que la valeur représentée est trop grande.

                  -
                  Edité par jo_link_noir 19 juillet 2023 à 4:07:54

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 juillet 2023 à 8:49:37

                    Ce n'est pas la taille de la mémoire qui détermine le nombre de bits des entiers.

                    C'est un compromis entre différentes choses

                    • Un processeur est câblé pour faire certaines opérations directement, sur des entiers de certaines tailles
                    • Il se peut que les programmeurs aient besoin d'entiers plus grands
                    • Dans ce cas on peut bricoler, par exemple, une addition sur 256 bits par une suite d'opérations sur 8, 16, 32 ou 64 bits, avec report de la retenue
                    • Si on programme le compilateur C pour que int soit sur 256 bits, ça marchera
                    • Mais ils prendront plus de place chacun, et ça peut conduire à du gaspillage
                    • D'où l'idée de proposer des entiers de différents types, short, long,....

                    Mais combien de bits pour chacun des types entiers ? Le choix est fait par les gens qui écrivent les compilateurs. Qui évidemment n'ont pas la même impression sur ce qu'est un "entier normal sur un ordinateur moyen" que leurs collègues des années 70, 80, 90,...

                    Bref c'est un arbitrage entre

                    • Les possibilités du processeur (opérations câblées), actuellement 32, 64, 128 bits 
                    • L'idée de ce qu'est un entier normal dans un programme pour ne pas gaspiller en prenant trop grand

                    La capacité de la mémoire, ça détermine le nombre de bits nécessaires pour un pointeur. Actuellement, 32  bits (qui correspond a 4 gigas) c'est plus assez, et 64, c'est très large pour un bon moment.

                    Mais personne ne dit plus j'espère  qu'un pointeur doit pouvoir rentrer dans un entier.

                    -
                    Edité par michelbillaud 19 juillet 2023 à 13:13:06

                    • Partager sur Facebook
                    • Partager sur Twitter

                    integer et char...

                    × 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