0
votes

C: Comment une longue portée est-elle une gamme beaucoup plus grande que longtemps tout en utilisant 8 octets d'espace?

J'ai écrit un bref programme qui utilise le Tailleof () Comprenez l'espace utilisé par divers types de données en C avec le compilateur gcc sur 64 bits Linux. La sortie est indiquée ci-dessous: xxx

ma question concerne le long int et long long long int types de données. < ol>

  • Si nous examinons les variantes signées par défaut de ces deux, comment long LONG LONG 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 (-2 147.483 648 à 2 147 483 647) lorsqu'il utilise les mêmes 8 octets d'espace par unité? Aussi,
  • Pourquoi utiliser long du tout et pas seulement utiliser long long tout le temps?

    edit: 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 limites.h . La sortie corrigée se lit maintenant: xxx


  • 0 commentaires

    6 Réponses :


    1
    votes

    Selon votre deuxième question LONG est un type peu dangereux à utiliser car cela dépend du compilateur. long peut prendre 4 ou 8 octets


    0 commentaires

    1
    votes

    Une réponse courte est non Vous ne pouvez pas avoir plus de gamme dans 8 octets

    Si vous connaissez les microcontrôleurs ou la différence entre les systèmes 32 bits et les systèmes 64 bits

    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"

    Parce que nous voulons nous assurer de la plage valide de celle que nous pouvons stocker dans la variable

    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


    0 commentaires

    2
    votes

    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 , pas un signé long . Sur votre système, un long aura une plage aussi large que comme un long long , il n'y a donc pas de besoin réel de vous d'utiliser long long . Mais sur d'autres systèmes, les tailles sont susceptibles d'être différentes et les différences pourraient vous importer.


    0 commentaires

    2
    votes

    La plage de long et long long sur votre système est la même: -2 63 à 2 63 63 -1. Vous pouvez vérifier en imprimant les valeurs de LONG_MIN ET long_max . 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.)

    La plage de types dépend de la plate-forme. La plage portable de long est -2 31 +1 à 2 31 -1. La plage portable de long long est -2 63 +1 à 2 63 -1. Vous devez utiliser long si vous avez besoin de plus que la plage portable de int (qui est -2 15 +1 à 2 15 < / sup> -1) mais pas plus que la plage portable de long . Plus pratiquement, la plupart du temps, vous utiliseriez long lorsque vous devez utiliser une bibliothèque qui manipule les valeurs de type long .

    Parmi les plates-formes communes, long 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 est toujours de 32 bits comme sur Windows 32 bits.


    1 commentaires

    Merci, modifié mon code pour utiliser les différentes exansions de macro limite.



    1
    votes

    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.

    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.

    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.


    0 commentaires

    0
    votes

    c ne spécifie pas les tailles de types arithmétiques, il spécifie uniquement la plage minimale ils doivent pouvoir représenter avec une précision minimale ; La mise en œuvre peut choisir d'utiliser une plage plus large, mais pas plus étroite.

    SO SE PER LA DÉFINITION LANGUE, un long doit être capable de représenter des valeurs dans au moins la plage [- (2 31 -1) ... 2 31 -1] 1 , ce qui implique une taille de au moins 32 bits. Toutefois, sur votre implémentation particulière, ils ont décidé de soutenir une plage plus large pour long .


    1. c Ni suppose ni ne nécessite que le complément de deux représentations pour les valeurs entières signées.

    0 commentaires