Simplement mis en C et variantes (contrairement à wuss java avec sa machine virtuelle) la taille des types primitifs sur différentes cibles peut varier considérablement, et il n'y a vraiment aucune garantie sauf si vous utilisez les types de largeur fixe définis dans stdint.h
, et même alors Votre implémentation doit les soutenir. Quoi qu'il en soit hypothétiquement (parce que sur la plupart des machines modernes, un octet est un octet, pour des raisons de réseautage je suppose (ASCII)) sizeof renvoie-t-il la taille d'un type de données en octets ou en octets?Est-ce que sizeof renvoie le nombre d'octets ou le nombre d'octets d'un type dans C?
Répondre
Réponse: sizeof
retourne la taille du type dans octets.
Exemple: sizeof(char)
est garantie à 100% être 1
, mais cela ne veut pas dire que c'est un octet (8 bits).
prouvé par la norme:
en 6.5.3.4, point 2:
L'opérateur sizeof cède la taille (en octets) de son opérande, qui peut être un expression ou le nom entre parenthèses d'un type. La taille est déterminée à partir du type de l'opérande. Le résultat est un entier. Si le type de l'opérande est un type de tableau de longueur variable , l'opérande est évalué; sinon, l'opérande n'est pas évalué et le résultat est une constante entière .
...
Appliqué à un opérande qui est de type char, unsigned char ou char signé, (ou une version quali fi ée de celle-ci), le résultat est 1. Appliqué à un opérande de type tableau , le résultat est le nombre total d'octets dans le tableau. Lorsqu'il est appliqué à un opérande de structure ou de type union, le résultat est le nombre total d'octets dans un tel objet, y compris le rembourrage interne et arrière.
En outre, dans la section 3.6, point 3:
Un octet est composé d'une séquence contiguë de bits, dont le nombre est défini par l'implémentation-
Très complet, merci. – awiebe
sizeof
retourne toujours la taille en nombre d'octets. Mais selon wikipedia:
Dans les langages de programmation C et C++, l'opérateur unaire sizeof est utilisé pour calculer la taille de tout type de données, mesuré en nombre d'octets nécessaires pour représenter le type. Un octet dans ce contexte est le même qu'un caractère non signé, et peut être plus grand que 8 bits, bien que ce soit peu commun.
sizeof
donne la taille en octets.Cependant, notez que "byte" est un terme technique dans la norme C, et est défini tel que sizeof(char) == 1
.
De ma propre expérience, travaillant sur les contrôleurs de micro intégrés avec exotiques compilateurs 'C', j'ai vu:
sizeof(uint8)
retour 1
sizeof(uint16)
retour 1
sizeof(uint32)
retour 2
Clairement, j'avais affaire à une machine dont la plus petite entité adressable était en 16 bits, donc le sizeof n'est pas conforme à C89 ou C99.
Je dirais que sur les systèmes conformes à la norme C89 & C99, la réponse acceptée est correcte. Malheureusement, un compilateur "C" peut encore être appelé un compilateur "C", même s'il n'est pas conforme à une norme de 25 ans. J'espère que cette réponse aidera à mettre les choses en perspective, compte tenu des systèmes plus exotiques.
- 1. Taille du tampon: N * sizeof (type) ou sizeof (var)? C++
- 2. Doctrine: Le nombre de résultats renvoie plus que des résultats
- 3. Renvoie le nombre de correspondances de C# dictionnaire
- 4. mysqli_field_type renvoie un nombre
- 5. nombre maximum pour le nombre (*)
- 6. La requête renvoie le nombre incorrect
- 7. Sizeof Struct vs Sizeof type
- 8. mvc3/razor String.Format ("{0: c}", totalprice) ne renvoie aucun nombre décimal ou nombre après
- 9. sizeof (value) vs sizeof (type)?
- 10. utiliser le nombre de sélections (*) à chaque fois ou enregistrer le nombre comme un nombre directement
- 11. Inverser le nombre en C#
- 12. Ai-je la garantie que sizeof (type) == sizeof (type non signé)?
- 13. Résultat de 'sizeof' sur le tableau des structures en C?
- 14. Nombre d'arguments dans le fichier C++
- 15. obtenir le nombre d'utilisateurs de type différent
- 16. Python - Renvoie le nombre max dans un tableau. Erreurs
- 17. Le calcul du pourcentage renvoie le nombre entier
- 18. C socket recv renvoie le nombre d'octets mais rien dans le tampon
- 19. Comment obtenir le type et le nombre de contenus .zip
- 20. renvoie le nombre de true/false dans une colonne d'une table SQL dans C#?
- 21. C, convertir le nombre hexadécimal en nombre décimal sans fonctions
- 22. Nombre de membres dans le type conceptuel ne correspond pas au nombre de membres sur le côté de l'objet type
- 23. Que retourne datagrid.columns [nombre]?
- 24. ORA-01422: l'extraction exacte renvoie plus que le nombre de lignes demandé dans RETOUR DANS
- 25. Opérateur sizeof C/C++: Pourquoi sizeof ('a') renvoie-t-il des valeurs différentes?
- 26. Renvoie le nombre de valeurs enum. (Taille de Enum typedef)
- 27. Nombre Nombre d'éléments dans le tableau ci-dessus 0
- 28. Obtenir le nombre de chaînes dans le vecteur C++
- 29. sizeof PHP incorrect ou compter
- 30. Obtenir le nombre d'éléments dans un nombre de mêmes éléments
Octets, mais un seul octet (représenté par 'char') a des bits' CHAR_BITS'. Si vous voulez le nombre d'octets dans un 'T', faites' sizeof (T) * CHAR_BITS/8'. Sur la plupart des plates-formes, 'CHAR_BITS' est' 8'. – GManNickG
@GManNickG 'CHAR_BIT' (il n'y a pas de S) :) – Praetorian
float octetPercent = sizeof (T) * CHAR_BIT /8.0; – awiebe