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;
}
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.
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.
Si debugger, c’est supprimer des bugs, alors programmer ne peut être que les ajouter - Edsger Dijkstra
× 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.
Développeur Web autodidacte HTML5/CSS3/JS + C# (ASP.NET Core) / Python (Django)
Développeur Web autodidacte HTML5/CSS3/JS + C# (ASP.NET Core) / Python (Django)
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub