Maison  >  Article  >  développement back-end  >  Pourquoi le comportement de « int64_t », « long int » et « long long int » diffère-t-il dans les compilateurs 32 bits et 64 bits ?

Pourquoi le comportement de « int64_t », « long int » et « long long int » diffère-t-il dans les compilateurs 32 bits et 64 bits ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-30 06:39:27446parcourir

Why Does the Behavior of `int64_t`, `long int`, and `long long int` Differ in 32-bit and 64-bit Compilers?

long long int vs. long int vs. int64_t en C

Considérez le programme C suivant :

<code class="cpp">#include <iostream>
#include <cstdint>

template <typename T>
bool is_int64() { return false; }

template <>
bool is_int64<int64_t>() { return true; }

int main()
{
    std::cout << "int:\t" << is_int64<int>() << std::endl;
    std::cout << "int64_t:\t" << is_int64<int64_t>() << std::endl;
    std::cout << "long int:\t" << is_int64<long int>() << std::endl;
    std::cout << "long long int:\t" << is_int64<long long int>() << std::endl;

    return 0;
}</code>

Dans les compilations GCC 32 bits et MSVC 32/64 bits, la sortie du programme sera :

int:           0
int64_t:       1
long int:      0
long long int: 1

Cependant, dans une compilation GCC 64 bits, la sortie deviendra :

int:           0
int64_t:       1
long int:      1
long long int: 0

Ce comportement est dû au fait que dans les compilations 64 bits, int64_t est défini comme long int, et non comme long long int. Pour résoudre ce problème, nous pouvons utiliser des vérifications spécifiques à la plate-forme comme suit :

<code class="cpp">#if defined(__GNUC__) && (__WORDSIZE == 64)
template <>
bool is_int64<long long int>() { return true; }
#endif</code>

Cependant, cette solution n'est pas idéale, car elle repose sur des combinaisons spécifiques de compilateur et de plate-forme. Une méthode plus fiable consisterait à spécifier explicitement l’équivalence de type au compilateur. Malheureusement, C ne permet pas de définir une telle équivalence entre les types de données de base. Au lieu de cela, nous pouvons nous appuyer sur des traits de type, tels que std::is_same. Par exemple :

<code class="cpp">// C++11
template <typename T>
void same_type(T, T) {}

void foo()
{
    long int x;
    long long int y;
    same_type(x, y); // Will now compile successfully
}</code>

Dans cet exemple, std::is_same est utilisé pour déterminer si x et y ont le même type, quelle que soit leur représentation sous-jacente.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn