首页  >  文章  >  后端开发  >  为什么“long int”有时表现得像 C 中的“int64_t”?

为什么“long int”有时表现得像 C 中的“int64_t”?

Barbara Streisand
Barbara Streisand原创
2024-10-30 22:45:18444浏览

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

C 中的 Long Long Int 与 Long Int 与 Int64_t

使用 C 类型特征时,可能会遇到一些奇怪的行为。考虑以下程序:

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

在 32 位编译中,输出符合预期:

int:           0
int64_t:       1
long int:      0
long long int: 1

但是,在 64 位 GCC 编译中,输出不同:

int:           0
int64_t:       1
long int:      1
long long int: 0

这是由于64位模式下int64_t的定义不同造成的:

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

64位模式下,int64_t被定义为long int,而不是long long int。

要解决此问题,可以将 is_int64 模板专门用于 long long int:

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

但是,这是一种 hackish 解决方案。有没有办法指定编译器的类型等效性?

不幸的是,这在 C/C 中是不可能的。编译器定义基本数据类型等效性,而 typedef 仅采用一种方式。

另一种解决方法是使用类型特征来检查类型的属性,而不是依赖于它们的确切名称:

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

这种方法允许在不显式比较类型的情况下检查类型属性。

以上是为什么“long int”有时表现得像 C 中的“int64_t”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn