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