Rumah >pembangunan bahagian belakang >C++ >Mengapakah Gelagat `int64_t`, `long int` dan `long long int` Berbeza dalam Penyusun 32-bit dan 64-bit?

Mengapakah Gelagat `int64_t`, `long int` dan `long long int` Berbeza dalam Penyusun 32-bit dan 64-bit?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-30 06:39:27515semak imbas

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

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