Rumah > Artikel > pembangunan bahagian belakang > Mengapakah Gelagat `int64_t`, `long int` dan `long long int` Berbeza dalam Penyusun 32-bit dan 64-bit?
long long int vs. long int vs. int64_t dalam C
Pertimbangkan program C berikut:
<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>
Dalam kedua-dua kompilasi 32-bit GCC dan 32/64-bit MSVC, output program ialah:
int: 0 int64_t: 1 long int: 0 long long int: 1
Walau bagaimanapun, dalam kompilasi GCC 64-bit, output akan berubah kepada:
int: 0 int64_t: 1 long int: 1 long long int: 0
Tingkah laku ini timbul kerana dalam kompilasi 64-bit, int64_t ditakrifkan sebagai long int, bukan long long int. Untuk membetulkannya, kami boleh menggunakan semakan khusus platform seperti berikut:
<code class="cpp">#if defined(__GNUC__) && (__WORDSIZE == 64) template <> bool is_int64<long long int>() { return true; } #endif</code>
Walau bagaimanapun, penyelesaian ini tidak sesuai, kerana ia bergantung pada gabungan pengkompil dan platform tertentu. Kaedah yang lebih dipercayai adalah dengan menyatakan secara eksplisit kesetaraan jenis kepada pengkompil. Malangnya, C tidak menyediakan cara untuk menentukan kesetaraan sedemikian antara jenis data asas. Sebaliknya, kita boleh bergantung pada ciri jenis, seperti std::is_same. Contohnya:
<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>
Dalam contoh ini, std::is_same digunakan untuk menentukan sama ada x dan y mempunyai jenis yang sama, tanpa mengira perwakilan asasnya.
Atas ialah kandungan terperinci Mengapakah Gelagat `int64_t`, `long int` dan `long long int` Berbeza dalam Penyusun 32-bit dan 64-bit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!