Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utiliser un unsigned int

Valeur aléatoire en sortie

Sujet résolu
    15 septembre 2018 à 15:12:55

    Bonjour,

    Voilà un code qui demande à saisir un nombre entier non signé, si je saisis un nombre signé par exemple -4, j'obtiens 4929292 quelquechose :

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
    	unsigned int test;
    
    	printf("Type in : ");
    
    	if(scanf("%u", &test) != 1)
    	{
    		fprintf(stderr,"Error : Failed to read user input... \n");
    		return EXIT_FAILURE;
    	}
    	else
    	{
    		printf("You typed : %u \n", test);
    	}
    
    	return 0;
    }

    Merci d'avance

    -
    Edité par Valenciano 15 septembre 2018 à 15:19:23

    • Partager sur Facebook
    • Partager sur Twitter

    Développeur Web autodidacte HTML5/CSS3/JS + C# (ASP.NET Core) / Python (Django)

      15 septembre 2018 à 20:59:20

      Hello, 

      unsigned int test;
      scanf("%u", &test);

      n'empêche pas l'utilisateur de rentrer un int signé, mais comme la range d'un uint32 est de 0 à 4294967295 et que tu rentres du coup une valeur "out of range" tu te retrouves avec un dépassement de capacité.

      printf("You typed : %u \n", test);

      Même chose ici lorsque la valeur dans test est négative, et que tu utilises %u comme format.

      Le mieux si tu veux prévenir le programme de continuer si l'utilisateur introduit une valeur négative est encore de faire simplement le check :

      #include <stdio.h>
      #include <stdlib.h>
      
      int main()
      {
          int test;
          printf("Type in : ");
      
          if((scanf("%d", &test) != 1) || (test<0))
          {
              fprintf(stderr,"Error : Failed to read user input... \n");
              return EXIT_FAILURE;
          }
          else
          {
              printf("You typed : %d \n", test);
          }
      
          return 0;
      }
      





      • Partager sur Facebook
      • Partager sur Twitter
        16 septembre 2018 à 12:15:01

        Salut Kolfering,

        Merci pour ta réponse. Effectivement ça fonctionne.

        Si je comprends bien déclarer un type unsigned est à éffectuer en interne lorsqu'il y a des manipulations dans le programme hors saisie utilisateur ?

        • Partager sur Facebook
        • Partager sur Twitter

        Développeur Web autodidacte HTML5/CSS3/JS + C# (ASP.NET Core) / Python (Django)

          16 septembre 2018 à 16:34:44

          Une autre solution serait de récupérer l'input utilisateur dans un tableau de char, admettons l'input -34 qui donnerait le tableau suivant ['-']['3']['4']['\0']. Il est ensuite possible de vérifier que l'input est bien un nombre valide : il y a un '-' ou non, il n'y a bien que des caractères [0-9] et pas d'autres, etc ...

          strtol() et autres font le boulot ensuite pour transformer le tableau en un véritable nombre entier.

          • Partager sur Facebook
          • Partager sur Twitter
            19 septembre 2018 à 11:32:12

            Valenciano a écrit:

            Salut Kolfering,

            Merci pour ta réponse. Effectivement ça fonctionne.

            Si je comprends bien déclarer un type unsigned est à éffectuer en interne lorsqu'il y a des manipulations dans le programme hors saisie utilisateur ?


            Déclarer un type unsigned c'est uniquement préciser au processeur quoi faire avec le premier bit de ta variable.

            Un exemple avec des chars (par ce qu'il n'y a que 8bit et c'est donc plus simple à écrire, mais ça fonctionne parreil avec un short ou un int).

            Si je déclare char c, je réserve 1 octet (soit 8bit) pour ma variable c.

            Sur ces 8 bits, le premier va servir à déterminer le signe de ma variable et le reste à stocker sa valeur.

            Ainsi 42 s'écrit : 00101010

            Et -42 : 10101010

            Le premier bit ne pouvant pas être utilisé, la valeur absolue max d'un char est : 2 puissance 7 = 128. Pour être tout à fait complet la range de valeur d'un char est [-128; 127], pourquoi 127 ? car on perd une valeur pour pouvoir stocker le 0.

            Dans le cas d'un unsigned char, on indique au processeur que le premier bit ne servira pas déterminer le signe de la valeur puisqu'il n'est pas possible d'avoir de valeur négative. Par conséquent 10101010 = 170.

            Donc si tu faits :

            usigned char c = -42;

            celà revient à stocker 170 dans c.

            • Partager sur Facebook
            • Partager sur Twitter
            Si debugger, c’est supprimer des bugs, alors programmer ne peut être que les ajouter - Edsger Dijkstra
              19 septembre 2018 à 11:48:06

              damjuve a écrit:

              Ainsi 42 s'écrit : 00101010

              Et -42 : 10101010

              ...

              Heu pas vraiment, effectivement le bit de poids fort c'est pour le signe mais le reste c'est pas exactement ça, pour rappel :

              1 = 0000 0001
              mais -1 != 1000 0001

              la vrai valeur de -1 c'est :

               0 - 1 == 0000 0000 - 0000 0001 == 1111 1111

              et pour le vrai calcule comme on l'apprend à l'école, on parle de complément à deux, c'est le complement à 1, +1 soit :

              // -3
              
              // complément à 1 de la valeur 3
              0000 0011 -> 1111 1100 // inversion des bits : 1 -> 0 et 0 -> 1
              
              // complement à 2 :
              1111 1100 + 1 == 1111 1101
              
              // donc -3 s'écrit 1111 1101





              • Partager sur Facebook
              • Partager sur Twitter

              la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

              Mon GitHub

                19 septembre 2018 à 12:09:49

                @ox223252

                C'est vrai j'oubli toujours cette subtilité. Au temps pour moi :)

                • Partager sur Facebook
                • Partager sur Twitter
                Si debugger, c’est supprimer des bugs, alors programmer ne peut être que les ajouter - Edsger Dijkstra
                  19 septembre 2018 à 12:20:19

                  damjuve a écrit:

                  @ox223252

                  C'est vrai j'oubli toujours cette subtilité. Au temps pour moi :)

                  Pas de problème, c'est pour ça que le travail à plusieurs est plus efficace ^^

                  • Partager sur Facebook
                  • Partager sur Twitter

                  la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

                  Mon GitHub

                  Utiliser un unsigned int

                  × 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