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

Mary-Kate Olsen
Lepaskan: 2024-10-30 06:39:27
asal
455 orang telah melayarinya

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

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

Walau bagaimanapun, dalam kompilasi GCC 64-bit, output akan berubah kepada:

int:           0
int64_t:       1
long int:      1
long long int: 0
Salin selepas log masuk

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

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

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!

sumber:php.cn
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!