#include <stdio.h>
int main() {
unsigned long long int num = 285212672; //FYI: fits in 29 bits
int normalInt = 5;
printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
return 0;
}
Production:
My number is 8 bytes wide and its value is 285212672l. A normal number is 0.
Je suppose que ce résultat inattendu provient de l'impression du unsigned long long int
. Comment avez - vous printf()
une unsigned long long int
?
Réponses:
Utilisez le modificateur ll (el-el) long-long avec la conversion u (non signé). (Fonctionne sous Windows, GNU).
la source
long long
arguments àprintf
et utilisez le mauvais format pour l'un d'entre eux, disons à la%d
place de%lld
, alors même les arguments imprimés après le mauvais peuvent être complètement désactivés (ou même provoquer unprintf
crash) ). Essentiellement, les arguments variables sont passés à printf sans aucune information de type, donc si la chaîne de format est incorrecte, le résultat est imprévisible.Vous pouvez essayer d' utiliser la bibliothèque inttypes.h qui vous donne types tels que
int32_t
,int64_t
,uint64_t
etc. Vous pouvez ensuite utiliser ses macros telles que:Ceci est "garanti" pour ne pas vous causer le même problème que
long
,unsigned long long
etc., car vous n'avez pas à deviner le nombre de bits dans chaque type de données.la source
PRId64
- ci , lesPRId32
macros définies?inttypes.h
PRIu64
etPRIu32
pour les entiers non signés.inttypes.h
standard? N'est-ce passtdint.h
?leastX
etfastX
(qui peuvent en fait être plus larges que ceux indiqués) sont obligatoires.%d
-> pourint
%u
-> pourunsigned int
%ld
-> pourlong int
oulong
%lu
-> pourunsigned long int
oulong unsigned int
ouunsigned long
%lld
-> pourlong long int
oulong long
%llu
-> pourunsigned long long int
ouunsigned long long
la source
Pour une longue période (ou __int64) en utilisant MSVS, vous devez utiliser% I64d:
la source
En effet,% llu ne fonctionne pas correctement sous Windows et% d ne peut pas gérer les entiers 64 bits. Je suggère d'utiliser plutôt PRIu64 et vous constaterez qu'il est également portable pour Linux.
Essayez plutôt ceci:
Production
la source
int64_t
place car il peut bien y avoir des implémentations avec long long plus grand que longSous Linux c'est le cas
%llu
et sous Windows c'est%I64u
Bien que j'ai trouvé que cela ne fonctionne pas dans Windows 2000, il semble y avoir un bogue!
la source
unsigned long long
type de données est relativement nouveau (à l'époque, avec la norme C99) mais que les compilateurs C (y compris MinGW / GCC) utilisent l'ancien runtime Microsoft C qui ne supportait que la spécification C89. Je n'ai accès qu'à des documents API Windows vraiment anciens et raisonnablement récents. Il est donc difficile de dire exactement quand leI64u
support a été supprimé. Mais cela ressemble à l'ère XP.Compilez-le au format x64 avec VS2005:
la source
En plus de ce que les gens écrivaient il y a des années:
main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]
printf("%llu\n", k);
Ensuite, votre version de mingw n'est pas par défaut c99. Ajouter ce drapeau du compilateur:
-std=c99
.la source
Apparemment, personne n'a mis au point une solution multiplateforme * depuis plus d'une décennie depuis [l'année] 2008, je vais donc ajouter la mienne 😛. Plz upvote. (Blague. Je m'en fiche.)
Solution:
lltoa()
Comment utiliser:
Exemple de l'OP:
Contrairement à la
%lld
chaîne de format d'impression, celle-ci fonctionne pour moi sous GCC 32 bits sous Windows.*) Eh bien, presque multi-plateforme. Dans MSVC, vous avez apparemment besoin
_ui64toa()
delltoa()
.la source
lltoa
.Les choses non standard sont toujours étranges :)
pour la partie longue et longue sous GNU c'est
L
,ll
ouq
et sous les fenêtres je crois que c'est
ll
seulementla source
Hex:
Production:
la source
Eh bien, une façon est de le compiler en x64 avec VS2008
Cela fonctionne comme vous vous en doutez:
Pour le code 32 bits, nous devons utiliser le spécificateur de format __int64 correct% I64u. Alors ça devient.
Ce code fonctionne pour les compilateurs VS 32 et 64 bits.
la source