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!