Taille de short, int, long, float, double, long, double, char
Je veux trouver le (court /int /long /float /double /double long /char) la taille, j'ai donc écrit ce code:
printf("short\t\t%d\n", sizeof(short));
printf("int\t\t%d\n", sizeof(int));
printf("long\t\t%d\n", sizeof(long));
printf("float\t\t%d\n", sizeof(float));
printf("double\t\t%d\n", sizeof(double));
printf("long double\t%d\n", sizeof(long double));
printf("char\t\t%d\n", sizeof(char));
MAIS
la sortie est:
type bytes
short 512
int 512
long 1024
float 1024
double 1024
long double 1024
char 256
Pourquoi le nombre d'octets si grand?
Ne devrait-elle pas être de 2, 8, ...?
vous avez raison, il devrait normalement... qu'est-ce que le contexte vous sont en cours d'exécution? tout d'abord la langue (en supposant que C), compilateur, matériel, etc.
Ce qui est étrange. Quel système d'exploitation, compilateur, etc?
Pour ce que ça vaut, tout devient de gauche décalé de 8 bits...
À l'aide de
Ce qui est étrange. Quel système d'exploitation, compilateur, etc?
Pour ce que ça vaut, tout devient de gauche décalé de 8 bits...
sizeof
renvoie une size_t
, pas un int
. Donc %d
n'est pas approprié.À l'aide de
%d
pour imprimer un size_t
ne crée pas une conversion implicite de size_t
à int
. Au mieux, il réinterprète les octets d'un size_t
comme un int
. Au pire, il bolluxes la pile car la plate-forme de l'ABI a été violé, ce qui peut engendrer des débordements par un programme, un immédiates de l'accident, ou d'autres effets indésirables.OriginalL'auteur | 2013-09-20
Vous devez vous connecter pour publier un commentaire.
sizeof
donne unsize_t
, pas unint
. Donc%d
n'est pas approprié; vous êtes en invoquant un comportement indéterminé.Pour imprimer correctement les données de type
size_t
, je suggère par exempleprintf("%zu\n", sizeof(float));
, etc.%zu
poursize_t
. En théorie, un comportement indéfini pourrait causer aucun problème, mais je doute que c'est la racine du problème que je ne peux pas reproduire le problème avec%d
.Liées - What est la différence entre un size_t et int en C++?.
OriginalL'auteur Oliver Charlesworth
Utilisation : spécificateur de format long unsigned int. cela fonctionnera très bien.
Ex:
printf("sizeof(long double)= %lu\n", sizeof(long double));
Ans:16
%lu
est une bonne spécificateur de format poursize_t
.Merci pour vos commentaires, pouvez-vous me corriger ? Je vais supprimer ma réponse une fois que vous me fournir la solution.
size_t
peut être un alias pour tout type non signé qui a au moins 16 bits. En effet, elle peut êtreunsigned short
,unsigned int
,unsigned long
, ouunsigned long long
. Sur "exotique" des implémentations, il peut même êtreunsigned char
! Lors de l'appel d'une fonction sans un prototype, ou un variadic fonction commeprintf
qui n'a pas de prototype de son variadic arguments, vous devez vous assurer que le type de l'argument correspond au type de la fonction attend l'argument;%lu
n'est pas le droit spécificateur de format, à moins quesize_t
arrive à êtreunsigned long
. En C99, et plus tard,%zu
fonctionne toujours.Cette question et ses réponses ont plus d'informations.
OriginalL'auteur akshaypmurgod