Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `int64_t` Berkelakuan Berbeza dalam Kompilasi GCC 64-bit?

Mengapakah `int64_t` Berkelakuan Berbeza dalam Kompilasi GCC 64-bit?

Susan Sarandon
Susan Sarandonasal
2024-10-30 19:19:31977semak imbas

Why Does `int64_t` Behave Differently in 64-bit GCC Compiles?

Long Long Int lwn. Long Int lwn. Int64_t dalam C

Ciri jenis C boleh mempamerkan tingkah laku aneh, terutamanya dengan 64-bit yang ditandatangani jenis integer. Berikut ialah penerokaan sebabnya:

Dalam kompilasi 32-bit dan 64-bit (GCC dan MSVC), program berikut berkelakuan seperti yang dijangkakan:

<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>

Output menunjukkan dengan betul bahawa int64_t , long int dan long long int semuanya adalah jenis integer 64-bit yang setara.

Walau bagaimanapun, kompilasi GCC 64-bit menghasilkan hasil yang berbeza:

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

Tingkah laku yang mengejutkan ini berpunca daripada takrif perpustakaan standard C bagi int64_t:

<code class="cpp"># if __WORDSIZE == 64
typedef long int  int64_t;
# else
__extension__
typedef long long int  int64_t;
# endif</code>

Dalam kompilasi 64-bit, int64_t ditakrifkan sebagai int panjang, bukan int panjang panjang. Ini bermakna pengkhususan templat is_int64() yang menyemak int64_t akan sepadan dengan long int dan bukannya long long int.

Penyelesaian menggunakan Pengkhususan Templat Separa:

Untuk menangani perkara ini isu, anda boleh menggunakan pengkhususan templat separa untuk mentakrifkan secara eksplisit is_int64() untuk long long int:

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

Walau bagaimanapun, penyelesaian ini bergantung pada pengkompil dan boleh membosankan untuk dilaksanakan bagi setiap jenis yang terjejas.

Penyelesaian Alternatif menggunakan Boost:

Boost menyediakan penyelesaian yang lebih elegan dengan boost::is_same templat variadic:

<code class="cpp">#include <boost/type_traits/is_same.hpp>

template <typename T>
bool is_int64_boost() { return boost::is_same<T, int64_t>::value; }

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

    return 0;
}</code>

Pendekatan ini akan mengenal pasti dengan betul semua jenis integer 64-bit yang setara, tanpa mengira perwakilan tepatnya dalam pustaka standard.

Atas ialah kandungan terperinci Mengapakah `int64_t` Berkelakuan Berbeza dalam Kompilasi GCC 64-bit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn