Rumah > pembangunan bahagian belakang > C++ > Mengapakah `long int` kadangkala berkelakuan seperti `int64_t` dalam C ?

Mengapakah `long int` kadangkala berkelakuan seperti `int64_t` dalam C ?

Barbara Streisand
Lepaskan: 2024-10-30 22:45:18
asal
582 orang telah melayarinya

Why does `long int` sometimes behave like `int64_t` in C  ?

Long Long Int lwn. Long Int lwn. Int64_t dalam C

Semasa menggunakan ciri jenis C, beberapa gelagat pelik boleh ditemui. Pertimbangkan program berikut:

<code class="c++">#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 penyusunan 32-bit, output adalah seperti yang dijangkakan:

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

Walau bagaimanapun, dalam penyusunan GCC 64-bit, output adalah berbeza:

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

Ini disebabkan oleh perbezaan dalam takrifan int64_t dalam mod 64-bit:

<code class="c++"># if __WORDSIZE == 64
typedef long int  int64_t;
# else
__extension__
typedef long long int  int64_t;
# endif</code>
Salin selepas log masuk

Dalam mod 64-bit, int64_t ditakrifkan sebagai int panjang, tidak panjang panjang int.

Untuk membetulkan perkara ini, seseorang boleh mengkhususkan templat is_int64 untuk int long long:

<code class="c++">#if defined(__GNUC__) && (__WORDSIZE == 64)
template <>
bool is_int64<long long int>() { return true; }
#endif</code>
Salin selepas log masuk

Walau bagaimanapun, ini adalah penyelesaian hackish. Adakah terdapat cara untuk menentukan kesetaraan jenis kepada pengkompil?

Malangnya, ia tidak boleh dilakukan dalam C/C . Pengkompil mentakrifkan kesetaraan jenis data asas dan typedef hanya berjalan satu arah.

Penyelesaian alternatif ialah menggunakan ciri jenis untuk menyemak sifat jenis, dan bukannya bergantung pada nama tepatnya:

<code class="c++">template <typename T>
struct some_type_trait : boost::false_type { };

template <>
struct some_type_trait<int64_t> : boost::true_type { };

// Usage
if (some_type_trait<long int>::value) {
    // ...
}</code>
Salin selepas log masuk

Pendekatan ini membolehkan untuk menyemak sifat jenis tanpa membandingkan jenis secara eksplisit.

Atas ialah kandungan terperinci Mengapakah `long int` kadangkala berkelakuan seperti `int64_t` dalam C ?. 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