J'ai écrit un bref programme qui utilise le ma question concerne le edit: strong>
Je regardais les gammes pour la compilation 32 bits avec GCC de ici , et pas 64 bits, ce qui a provoqué la confusion. Modifié mon code pour inclure les gammes de la sortie, ainsi que les tailles, à l'aide des macros limites définies dans Tailleof () Code> Comprenez l'espace utilisé par divers types de données en C avec le compilateur
gcc code> sur 64 bits Linux. La sortie est indiquée ci-dessous:
long int code> et
long long long int code> types de données. P> < ol>
long LONG LONG CODE> peut avoir une portée beaucoup plus élevée (-9 223 372 036 854 775 807 à 9.223,772 036,854 775.807) que
Long code> (-2 147.483 648 à 2 147 483 647) lorsqu'il utilise les mêmes 8 octets d'espace par unité? Aussi, li>
long code> du tout et pas seulement utiliser
long long code> tout le temps? li>
ol>
limites.h code>. La sortie corrigée se lit maintenant: p>
6 Réponses :
Selon votre deuxième question LONG code> est un type peu dangereux à utiliser car cela dépend du compilateur.
long code> peut prendre 4 ou 8 octets p>
Une réponse courte est non Vous ne pouvez pas avoir plus de gamme dans 8 octets p>
Si vous connaissez les microcontrôleurs ou la différence entre les systèmes 32 bits et les systèmes 64 bits p>
vous remplissez découvrez "INT" dans le système 8 bits est à seulement 2 octets, mais "INT" dans le système 32 bits est de 4 octets c'est pourquoi nous sommes habituellement int32_t sauf "int" p>
Parce que nous voulons nous assurer de la plage valide de celle que nous pouvons stocker dans la variable p>
Si longtemps dans le système 32 bits est à seulement 8 octets et ce système long dans 8 bits est 32 octets etc Le système 64 bits longue est de 128 bits p>
question 1 contient une erreur. La gamme (-2 147 483 648 à 2 147 483 647) s'applique à une valeur signée de 4 octets - dans votre cas A signé INT code>, pas un
signé long code>. Sur votre système, un
long code> aura une plage aussi large que comme un
long long code>, il n'y a donc pas de besoin réel de vous d'utiliser
long long code> . Mais sur d'autres systèmes, les tailles sont susceptibles d'être différentes et les différences pourraient vous importer. P>
La plage de La plage de types dépend de la plate-forme. La plage em> portable em> de Parmi les plates-formes communes, long code> et
long long code> sur votre système est la même: -2 63 sup> à 2 63 sup> 63 sup > -1. Vous pouvez vérifier en imprimant les valeurs de
LONG_MIN CODE> ET
. Lorsque deux types ont la même portée, ils ont généralement la même taille. (Cette propriété n'est pas garantie par le langage C, mais les plates-formes où ce n'est pas le cas est très inhabituel.) P>
long_max code>
long code> est -2 31 sup> +1 à 2 31 sup> -1. La plage portable de
long long code> est -2 63 sup> +1 à 2 63 sup> -1. Vous devez utiliser
long code> si vous avez besoin de plus que la plage portable de
int code> (qui est -2 15 sup> +1 à 2 15 < / sup> -1) mais pas plus que la plage portable de
long code>. Plus pratiquement, la plupart du temps, vous utiliseriez
long code> lorsque vous devez utiliser une bibliothèque qui manipule les valeurs de type
long code>. P>
long code> est typiquement la taille d'un registre de la machine (32 bits sur une machine 32 bits, 64 bits sur une machine 64 bits) (mais il doit être deux ( ou plus) registres sur une machine de 16 bits). Il y a une exception notable: sur des fenêtres 64 bits, la taille de
long code> est toujours de 32 bits comme sur Windows 32 bits. P>
Merci, modifié mon code pour utiliser les différentes exansions de macro limite.
La taille de chaque caractère, courte, int, longue et longue long et longue longue est choisie par les auteurs du compilateur, ils sont libres de choisir indépendants du processeur ou du système d'exploitation (la langue a des règles mais laisse la liberté). Vous ne pouvez tout simplement pas faire des hypothèses, vous devez tester comme vous l'avez fait ici, par compilateur par système d'exploitation cible par processeur cible. Ainsi, la solution STDINT.H qui est extrêmement spécifique à la bibliothèque Compilateur non C cible non cible, etc. Mais est là pour vous permettre de spécifier une variable de 8, 16, 32, ... bit. Si vos chemins sont éteints et que le mauvais stdint.h est utilisé lorsque vous construisez qu'il crée un imbécile en désordre si vous vous êtes compté sur ces tailles et que vous avez des outils différents installés avec des choix différents. P>
Vous trouverez donc des situations où de la taille courte et INT sont de la même taille ou de la même taille, de la même taille ou de la même taille sont de la même taille. C'est à quel point la langue fonctionne et pour un compilateur spécifique pour une cible / système spécifique où deux types sont de la même taille et que vous choisissez de ne pas utiliser STDINT.H, votre question est valide. Et la réponse est qu'il n'y a pas de bonne réponse, c'est le choix personnel des programmeurs de l'application pour une raison quelconque. Vous pouvez choisir INT au lieu de long si la même taille afin que votre Printf puisse utiliser% u au lieu de% LU, tout ce que vous choisissez, c'est juste pour vous. P>
La plupart des gens diront que c'est la mauvaise réponse à utiliser int ou longue ou longue longtemps, utilisez UINT32_T, UINT64_T, etc. P>
c ne spécifie pas les tailles de types arithmétiques, il spécifie uniquement la plage minimale em> ils doivent pouvoir représenter avec une précision minimale em>; La mise en œuvre peut choisir d'utiliser une plage plus large, mais pas plus étroite. P>
SO SE PER LA DÉFINITION LANGUE, un long code> doit être capable de représenter des valeurs dans au moins em> la plage
[- (2 31 sup> -1) ... 2 31 sup> -1] code> 1 sup>, ce qui implique une taille de au moins em> 32 bits. Toutefois, sur votre implémentation particulière, ils ont décidé de soutenir une plage plus large pour
long code>. P>