首页 > 后端开发 > C++ > 为什么 `int64_t`、`long int` 和 `long long int` 的行为在 32 位和 64 位编译器中不同?

为什么 `int64_t`、`long int` 和 `long long int` 的行为在 32 位和 64 位编译器中不同?

Mary-Kate Olsen
发布: 2024-10-30 06:39:27
原创
512 人浏览过

Why Does the Behavior of `int64_t`, `long int`, and `long long int` Differ in 32-bit and 64-bit Compilers?

C 中的 long long int 与 long int 与 int64_t

考虑以下 C 程序:

<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>
登录后复制

在32位GCC和32/64位MSVC编译中,程序的输出将是:

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 被定义为 long int,而不是 long long int。为了解决这个问题,我们可以使用特定于平台的检查,如下所示:

<code class="cpp">#if defined(__GNUC__) && (__WORDSIZE == 64)
template <>
bool is_int64<long long int>() { return true; }
#endif</code>
登录后复制

但是,这个解决方案并不理想,因为它依赖于特定的编译器和平台组合。更可靠的方法是显式指定编译器的类型等效项。不幸的是,C 没有提供一种方法来定义基本数据类型之间的等价性。相反,我们可以依赖类型特征,例如 std::is_same。例如:

<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>
登录后复制

在此示例中,std::is_same 用于确定 x 和 y 是否具有相同的类型,无论其底层表示如何。

以上是为什么 `int64_t`、`long int` 和 `long long int` 的行为在 32 位和 64 位编译器中不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板