首页 > 后端开发 > C++ > 正文

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

Barbara Streisand
发布: 2024-10-30 22:45:18
原创
443 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!