Pourquoi les compilateurs C spécifient-ils long 32 bits et long 64 bits?

N’aurait-il pas été plus logique de faire du 64 bits et de réserver longtemps jusqu’à ce que les nombres 128 bits deviennent une réalité?

    Oui, cela a du sens, mais Microsoft avait ses propres raisons pour définir «long» en tant que 32 bits.

    Pour autant que je sache, de tous les systèmes grand public actuels, Windows est le seul système d’exploitation où “long” est 32 bits. Sous Unix et Linux, c’est 64 bits.

    Tous les compilateurs pour Windows comstackront des versions “longues” sur 32 bits pour maintenir la compatibilité avec Microsoft.

    Pour cette raison, j’évite d’utiliser “int” et “long”. Parfois, j’utilise «int» pour les codes d’erreur et les booléens (en C), mais je ne les utilise jamais pour un code dépendant de la taille du type.

    La norme c n’a PAS spécifié la longueur en bits du type de données primitif, mais uniquement la plus petite longueur en bits. Les compilateurs peuvent donc avoir des options sur la longueur en bits des types de données primitifs. Lorsqu’il décide de la longueur en bits de chaque type de données primitif, le concepteur du compilateur doit prendre en compte plusieurs facteurs, y compris l’architecture de l’ordinateur.

    voici quelques références: http://en.wikipedia.org/wiki/C_syntax#Primitive_data_types

    Pour des raisons historiques. Pendant longtemps (jeu de mots voulu), “int” voulait dire 16 bits; donc “long” comme 32 bits. Bien sûr, les temps ont changé. D’où “long long” 🙂

    PS:

    GCC (et autres) supporte actuellement les entiers 128 bits sous la forme “(u) int128_t”.

    PPS:

    Voici une discussion sur les raisons pour lesquelles les employés de GCC ont pris les décisions qu’ils ont sockets:

    http://www.x86-64.org/pipermail/discuss/2005-August/006412.html

    C99 N1256 projet standard

    Les tailles de long et long long sont définies par la mise en œuvre, tout ce que nous soaps est:

    • taille minimum garantie
    • tailles relatives entre les types

    5.2.4.2.1 Tailles des types entiers donne les tailles minimales:

    1 […] Leurs valeurs définies pour la mise en œuvre doivent être égales ou supérieures en magnitude (valeur absolue) à celles indiquées […]

    • UCHAR_MAX 255 // 2 8 – 1
    • USHRT_MAX 65535 // 2 16 – 1
    • UINT_MAX 65535 // 2 16 – 1
    • ULONG_MAX 4294967295 // 2 32 – 1
    • ULLONG_MAX 18446744073709551615 // 2 64 – 1

    6.2.5 Les types disent alors:

    8 Pour deux types entiers avec le même niveau de signature et un rang de conversion d’entier différent (voir 6.3.1.1), la plage de valeurs du type avec un rang de conversion d’entier plus petit est une sous-gamme des valeurs de l’autre type.

    et 6.3.1.1 Des booléens, des caractères et des entiers déterminent les rangs de conversion relatifs:

    1 Chaque type d’entier a un rang de conversion d’entier défini comme suit:

    • Le rang de long long int doit être supérieur au rang de long int, qui doit être supérieur au rang de int, qui doit être supérieur au rang de short int, qui doit être supérieur au rang de char signé.
    • Le rang de tout type entier non signé doit être égal au rang du type entier signé signé, le cas échéant.
    • Pour tous les types entiers T1, T2 et T3, si T1 a un rang supérieur à T2 et T2 a un rang supérieur à T3, alors T1 a un rang supérieur à T3.

    Depuis l’époque du premier compilateur C pour un micro-ordinateur reprogrammable polyvalent, il était souvent nécessaire que le code utilise des types contenant exactement 8, 16 ou 32 bits, mais jusqu’en 1999, la norme ne fournissait pas explicitement aucun moyen pour les programmes de le spécifier. D’autre part, presque tous les compilateurs de micro-ordinateurs 8 bits, 16 bits et 32 ​​bits définissent “char” comme 8 bits, “court” comme 16 bits et “long” comme 32 bits. La seule différence entre eux est de savoir si “int” est 16 bits ou 32.

    Alors qu’un processeur 32 bits ou supérieur pourrait utiliser “int” en tant que type 32 bits, laissant “long” disponible en tant que types 64 bits, il existe un corpus de code substantiel qui s’attend à ce que “long” soit 32 bits. Bien que la norme C ait ajouté des types “à taille fixe” en 1999, il existe d’autres endroits dans la norme qui utilisent encore “int” et “long”, tels que “printf”. Alors que C99 a ajouté des macros pour fournir les spécificateurs de format appropriés pour les types entiers de taille fixe, il existe un corpus de code substantiel qui s’attend à ce que “% ld” soit un spécificateur de format valide pour int32_t, car il fonctionnera pour à peu près n’importe quel fichier 8 bits. , Plate-forme 16 bits ou 32 bits.

    Qu’il soit plus logique d’avoir «long» soit 32 bits, par respect pour une base de code existante datant de plusieurs décennies, ou 64 bits, afin d’éviter la nécessité d’utiliser les mots «long long» ou «int64_t» plus verbeux. les types 64 bits sont probablement un jugement, mais étant donné que le nouveau code devrait probablement favoriser l’utilisation de types de taille spécifiée lorsque cela est pratique, je ne suis pas sûr de voir un avantage irrésistible à la création de “longs” 64 bits, sauf si “int” est également 64 bits (ce qui créera des problèmes encore plus importants avec le code existant).