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

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

Susan Sarandon
Lepaskan: 2024-10-30 19:19:31
asal
1121 orang telah melayarinya

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>
Salin selepas log masuk

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
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan