Bonjour,
Pouvez vous m'expliquer pourquoi le code suivant m'écrit :
-2147483648
dans mon fichier ?
merci !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 size_t a = INT_MAX; a += 1; fprintf(ftest, "%zd",a);
Bonjour,
Pouvez vous m'expliquer pourquoi le code suivant m'écrit :
-2147483648
dans mon fichier ?
merci !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 size_t a = INT_MAX; a += 1; fprintf(ftest, "%zd",a);
l'attribut %z dans le fprintf, il correspond à quoi ?
et— limit of size_t
SIZE_MAX 65535
z : Specifies that a following d, i, o, u, x, or X conversion specifier applies to a size_t or the corresponding signed integer type argument; or that a following n conversion specifier applies to a pointer to a signed integer type corresponding to size_t argument.
"The quieter you become, the more you are able to hear"
"Plus vous êtes silencieux, plus vous êtes capable d'entendre"
Pas chez moi en tout cas :
m'écrit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 size_t a = INT_MAX-1; int b = INT_MAX -1; fprintf(ftest, "%zd %d\n",a, b);
2147483646 2147483646
Désolé, je ne vois pas ou est le problème ?
"The quieter you become, the more you are able to hear"
"Plus vous êtes silencieux, plus vous êtes capable d'entendre"
Le problème c'est que je ne comprends pas pourquoi l'affichage de INT_MAX + 1 avec un type size_t et l'option %zd me donne un nombre négatif ?
Tu n'as pas lu ce que j'ai écrit alors!!
size_t => %zu
ssize_t => %zd
"The quieter you become, the more you are able to hear"
"Plus vous êtes silencieux, plus vous êtes capable d'entendre"
C'est une nouveauté du C99 apparemment. Pour afficher les variables de type size_t j'utilise %lu avec un cast en unsigned long en argument :
Je suppose qu'on peut aussi utiliser %u et (unsigned int) si on sait que la valeur à afficher ne dépasse pas 65535 (qui peut forcément être stocké dans un unsigned int).
Code : Sélectionner tout - Visualiser dans une fenêtre à part printf ("%lu\n", (unsigned long)sizeof(int));
:wq
Cela n'a aucune importance, car à ma connaissance %z est utilisé aussi pour les ptrdiff_t.
Je ne suis pas d'accord avec la description: Pour moi, %z ne veut pas dire "c'est un size_t ou un truc qui y ressemble" mais "c'est un entier qui fait la taille d'un pointeur; les types size_t, ssize_t, ptrdiff_t, intptr_t répondent à ce critère"
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
d'après le man c'est %z pour size_t et %t pour ptrdiff_t
Aie! Au temps pour moi.
J'ignorais qu'il y avait deux spécificateurs différents pour les deux types.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Justement, j'utilise des size_t pour pouvoir avoir des grand nombres
J'ai également besoin d'enregistrer des doubles, en gardant une bonne précision (j'utilise alors %lg)
Peut être que cette façon de faire n'est pas très bonne, avez vous une autre méthode à me proposer ? peut être en binaire ? (mais là je ne sais pas comment on enregistre des double, surtout avec les problème d'endian )
Mon but est d'enregistrer le résultat de calculs de manière à pouvoir les recharger par la suite.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager